P4 trachea sample collected on Oct18 2018. epithelial subset
library(Seurat)
library(dplyr)
basal, secretory, and ciliated:
P4_10X_mm10_1.2.0 <- SetAllIdent(object = P4_10X_mm10_1.2.0, id = "res.0.8")
P4_Oct18_epi<-SubsetData(object=P4_10X_mm10_1.2.0,ident.use=c(1:5,8,11))
table(P4_Oct18_epi@meta.data$res.0.8,P4_Oct18_epi@meta.data$seq_group)
P4_Oct18_mut_green P4_Oct18_mut_red P4_Oct18_wt_green P4_Oct18_wt_red
1 225 0 149 2
11 107 0 58 1
2 28 0 278 1
3 163 0 143 0
4 285 0 11 0
5 167 0 125 0
8 195 0 24 0
colnames(P4_Oct18_epi@meta.data)[colnames(P4_Oct18_epi@meta.data) == 'res.0.8'] <- 'orig.0.8'
P4_Oct18_epi <- ScaleData(object = P4_Oct18_epi)
Scaling data matrix
|
| | 0%
|
|============================================================================================================================================| 100%
P4_Oct18_epi <- FindVariableGenes(object = P4_Oct18_epi, do.plot = TRUE, x.low.cutoff=0.1,x.high.cutoff = Inf, y.cutoff = 0.5)
Calculating gene means
0% 10 20 30 40 50 60 70 80 90 100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating gene variance to mean ratios
0% 10 20 30 40 50 60 70 80 90 100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|

run PCA on the set of genes
P4_Oct18_epi <- RunPCA(object = P4_Oct18_epi, do.print = FALSE)
PCAPlot(P4_Oct18_epi)

P4_Oct18_epi <- ProjectPCA(object = P4_Oct18_epi, do.print = F)
PCElbowPlot(object = P4_Oct18_epi)

PCHeatmap(object = P4_Oct18_epi, pc.use = 1:20, cells.use = 500, do.balanced = TRUE, label.columns = FALSE, num.genes = 25)

n.pcs.sub = 16
res.used <- 0.8
P4_Oct18_epi <- FindClusters(object = P4_Oct18_epi, reduction.type = "pca", dims.use = 1:n.pcs.sub,
resolution = res.used, print.output = 0, force.recalc = T)
P4_Oct18_epi <- RunTSNE(object = P4_Oct18_epi, dims.use = 1:n.pcs.sub, perplexity=30)
TSNEPlot(object = P4_Oct18_epi, do.label = T,pt.size = 0.4,group.by="res.0.8")



P4_Oct18_epi@meta.data$cell_type<-mapvalues(P4_Oct18_epi@meta.data$res.0.8,from=c("0","1","2","3","4","5","6","7","8","9"),to=c("Secretory","Secretory","Ciliated","Secretory","CiliaSecretory","Secretory","Basal","Basal","Ciliated","Ciliated"))
P4_epi_cellType<-P4_Oct18_epi@meta.data$cell_type
names(P4_epi_cellType)<-P4_Oct18_epi@cell.names
#this will be used in P4Oct_mm10_1_2_0_EC2.Rmd
ggplot(data=P4_Oct18_epi@meta.data,aes(genotype,fill=cell_type))+
geom_bar(position="fill")+ theme(axis.text.x = element_text(angle = 45, hjust = 1))

table(P4_Oct18_epi@meta.data$cell_type,P4_Oct18_epi@meta.data$genotype)
mut wt
Basal 143 145
CiliaSecretory 119 68
Ciliated 267 203
Secretory 641 376
compare between genotypes:
DE_P4_ciliated_genotype<-FindMarkers(P4_Oct18_epi,cells.1<-WhichCells(object=P4_Oct18_epi,cells.use = (P4_Oct18_epi@meta.data$genotype=="wt" & P4_Oct18_epi@meta.data$cell_type=="Ciliated" )),cells.2<-WhichCells(object=P4_Oct18_epi,cells.use = (P4_Oct18_epi@meta.data$genotype=="mut" & P4_Oct18_epi@meta.data$cell_type=="Ciliated" )),only.pos = F,logfc.threshold=0,min.pct=0.05)
| | 0 % ~calculating
|+ | 1 % ~02m 58s
|+ | 2 % ~02m 54s
|++ | 3 % ~02m 51s
|++ | 4 % ~02m 48s
|+++ | 5 % ~02m 43s
|+++ | 6 % ~02m 42s
|++++ | 7 % ~02m 47s
|++++ | 8 % ~02m 43s
|+++++ | 9 % ~02m 39s
|+++++ | 10% ~02m 37s
|++++++ | 11% ~02m 35s
|++++++ | 12% ~02m 32s
|+++++++ | 13% ~02m 29s
|+++++++ | 14% ~02m 28s
|++++++++ | 15% ~02m 25s
|++++++++ | 16% ~02m 23s
|+++++++++ | 17% ~02m 21s
|+++++++++ | 18% ~02m 19s
|++++++++++ | 19% ~02m 17s
|++++++++++ | 20% ~02m 15s
|+++++++++++ | 21% ~02m 13s
|+++++++++++ | 22% ~02m 11s
|++++++++++++ | 23% ~02m 09s
|++++++++++++ | 24% ~02m 08s
|+++++++++++++ | 25% ~02m 06s
|+++++++++++++ | 26% ~02m 04s
|++++++++++++++ | 27% ~02m 02s
|++++++++++++++ | 28% ~02m 00s
|+++++++++++++++ | 29% ~01m 59s
|+++++++++++++++ | 30% ~01m 57s
|++++++++++++++++ | 31% ~01m 55s
|++++++++++++++++ | 32% ~01m 54s
|+++++++++++++++++ | 33% ~01m 52s
|+++++++++++++++++ | 34% ~01m 50s
|++++++++++++++++++ | 35% ~01m 48s
|++++++++++++++++++ | 36% ~01m 47s
|+++++++++++++++++++ | 37% ~01m 45s
|+++++++++++++++++++ | 38% ~01m 43s
|++++++++++++++++++++ | 39% ~01m 42s
|++++++++++++++++++++ | 40% ~01m 40s
|+++++++++++++++++++++ | 41% ~01m 38s
|+++++++++++++++++++++ | 42% ~01m 36s
|++++++++++++++++++++++ | 43% ~01m 35s
|++++++++++++++++++++++ | 44% ~01m 33s
|+++++++++++++++++++++++ | 45% ~01m 31s
|+++++++++++++++++++++++ | 46% ~01m 30s
|++++++++++++++++++++++++ | 47% ~01m 28s
|++++++++++++++++++++++++ | 48% ~01m 26s
|+++++++++++++++++++++++++ | 49% ~01m 25s
|+++++++++++++++++++++++++ | 50% ~01m 23s
|++++++++++++++++++++++++++ | 51% ~01m 21s
|++++++++++++++++++++++++++ | 52% ~01m 20s
|+++++++++++++++++++++++++++ | 53% ~01m 18s
|+++++++++++++++++++++++++++ | 54% ~01m 16s
|++++++++++++++++++++++++++++ | 55% ~01m 15s
|++++++++++++++++++++++++++++ | 56% ~01m 13s
|+++++++++++++++++++++++++++++ | 57% ~01m 11s
|+++++++++++++++++++++++++++++ | 58% ~01m 10s
|++++++++++++++++++++++++++++++ | 59% ~01m 08s
|++++++++++++++++++++++++++++++ | 60% ~01m 06s
|+++++++++++++++++++++++++++++++ | 61% ~01m 05s
|+++++++++++++++++++++++++++++++ | 62% ~01m 03s
|++++++++++++++++++++++++++++++++ | 63% ~01m 02s
|++++++++++++++++++++++++++++++++ | 64% ~60s
|+++++++++++++++++++++++++++++++++ | 65% ~58s
|+++++++++++++++++++++++++++++++++ | 66% ~57s
|++++++++++++++++++++++++++++++++++ | 67% ~55s
|++++++++++++++++++++++++++++++++++ | 68% ~53s
|+++++++++++++++++++++++++++++++++++ | 69% ~52s
|+++++++++++++++++++++++++++++++++++ | 70% ~50s
|++++++++++++++++++++++++++++++++++++ | 71% ~48s
|++++++++++++++++++++++++++++++++++++ | 72% ~47s
|+++++++++++++++++++++++++++++++++++++ | 73% ~45s
|+++++++++++++++++++++++++++++++++++++ | 74% ~43s
|++++++++++++++++++++++++++++++++++++++ | 75% ~42s
|++++++++++++++++++++++++++++++++++++++ | 76% ~40s
|+++++++++++++++++++++++++++++++++++++++ | 77% ~38s
|+++++++++++++++++++++++++++++++++++++++ | 78% ~37s
|++++++++++++++++++++++++++++++++++++++++ | 79% ~35s
|++++++++++++++++++++++++++++++++++++++++ | 80% ~33s
|+++++++++++++++++++++++++++++++++++++++++ | 81% ~32s
|+++++++++++++++++++++++++++++++++++++++++ | 82% ~30s
|++++++++++++++++++++++++++++++++++++++++++ | 83% ~28s
|++++++++++++++++++++++++++++++++++++++++++ | 84% ~27s
|+++++++++++++++++++++++++++++++++++++++++++ | 85% ~25s
|+++++++++++++++++++++++++++++++++++++++++++ | 86% ~23s
|++++++++++++++++++++++++++++++++++++++++++++ | 87% ~22s
|++++++++++++++++++++++++++++++++++++++++++++ | 88% ~20s
|+++++++++++++++++++++++++++++++++++++++++++++ | 89% ~18s
|+++++++++++++++++++++++++++++++++++++++++++++ | 90% ~17s
|++++++++++++++++++++++++++++++++++++++++++++++ | 91% ~15s
|++++++++++++++++++++++++++++++++++++++++++++++ | 92% ~13s
|+++++++++++++++++++++++++++++++++++++++++++++++ | 93% ~12s
|+++++++++++++++++++++++++++++++++++++++++++++++ | 94% ~10s
|++++++++++++++++++++++++++++++++++++++++++++++++ | 95% ~08s
|++++++++++++++++++++++++++++++++++++++++++++++++ | 96% ~07s
|+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~05s
|+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~03s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~02s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed = 02m 46s
DE_P4_ciliated_genotype
write.table(DE_P4_ciliated_genotype,"DE_P4_ciliated_genotype.txt",sep="\t")
P4_ciliated_automatic_geneList<-DE_P4_ciliated_genotype$gene[DE_P4_ciliated_genotype$p_val_adj<0.001 & abs(DE_P4_ciliated_genotype$avg_logFC)>0.5 & abs(DE_P4_ciliated_genotype$pct.1-DE_P4_ciliated_genotype$pct.2)>0.15]
library(ggrepel)
DE_P4_ciliated_genotype$gene<-rownames(DE_P4_ciliated_genotype)
#DE_P4_secretory_genotype$sig<-DE_P4_secretory_genotype$p_val_adj<0.001
DE_P4_ciliated_genotype$threshold<- ifelse(DE_P4_ciliated_genotype$avg_logFC>0 & DE_P4_ciliated_genotype$p_val_adj<0.001, "wt_enrich",ifelse(DE_P4_ciliated_genotype$avg_logFC<0 & DE_P4_ciliated_genotype$p_val_adj<0.001, "mut_enrich","NotSignificant" ) )
ggplot(DE_P4_ciliated_genotype, aes(avg_logFC, -log10(p_val_adj))) + #volcanoplot with avg_logFC versus p_val_adj
geom_point(aes(col=threshold),size=0.2) + #add points colored by significance
scale_color_manual(values=c("green", "black","magenta"))+
ggtitle("P4Ciliated_wt/mut") + geom_text_repel(data=DE_P4_ciliated_genotype[DE_P4_ciliated_genotype$gene %in% P4_ciliated_automatic_geneList,], aes(label=gene), point.padding = 1, box.padding = .3) +
labs(y = expression(-log[10]*" "*"adjusted pvalue"), x = "avg log fold change") +
theme(legend.title = element_blank(), legend.position = "top")


DE_P4_ciliated_genotype[DE_P4_ciliated_genotype$gene %in% geneList$Primary.ciliary.dyskinesia,]
DE_P4_basal_genotype<-FindMarkers(P4_Oct18_epi,cells.1<-WhichCells(object=P4_Oct18_epi,cells.use = (P4_Oct18_epi@meta.data$genotype=="wt" & P4_Oct18_epi@meta.data$cell_type=="Basal" )),cells.2<-WhichCells(object=P4_Oct18_epi,cells.use = (P4_Oct18_epi@meta.data$genotype=="mut" & P4_Oct18_epi@meta.data$cell_type=="Basal" )),only.pos = F,logfc.threshold=0,min.pct=0.05)
| | 0 % ~calculating
|+ | 1 % ~02m 11s
|+ | 2 % ~02m 03s
|++ | 3 % ~02m 04s
|++ | 4 % ~02m 01s
|+++ | 5 % ~02m 01s
|+++ | 6 % ~01m 58s
|++++ | 7 % ~01m 58s
|++++ | 8 % ~01m 56s
|+++++ | 9 % ~01m 55s
|+++++ | 10% ~01m 53s
|++++++ | 11% ~01m 52s
|++++++ | 12% ~01m 51s
|+++++++ | 13% ~01m 50s
|+++++++ | 14% ~01m 48s
|++++++++ | 15% ~01m 47s
|++++++++ | 16% ~01m 45s
|+++++++++ | 17% ~01m 45s
|+++++++++ | 18% ~01m 43s
|++++++++++ | 19% ~01m 42s
|++++++++++ | 20% ~01m 40s
|+++++++++++ | 21% ~01m 39s
|+++++++++++ | 22% ~01m 38s
|++++++++++++ | 23% ~01m 37s
|++++++++++++ | 24% ~01m 35s
|+++++++++++++ | 25% ~01m 34s
|+++++++++++++ | 26% ~01m 33s
|++++++++++++++ | 27% ~01m 32s
|++++++++++++++ | 28% ~01m 30s
|+++++++++++++++ | 29% ~01m 29s
|+++++++++++++++ | 30% ~01m 27s
|++++++++++++++++ | 31% ~01m 26s
|++++++++++++++++ | 32% ~01m 25s
|+++++++++++++++++ | 33% ~01m 24s
|+++++++++++++++++ | 34% ~01m 22s
|++++++++++++++++++ | 35% ~01m 21s
|++++++++++++++++++ | 36% ~01m 20s
|+++++++++++++++++++ | 37% ~01m 19s
|+++++++++++++++++++ | 38% ~01m 17s
|++++++++++++++++++++ | 39% ~01m 16s
|++++++++++++++++++++ | 40% ~01m 15s
|+++++++++++++++++++++ | 41% ~01m 14s
|+++++++++++++++++++++ | 42% ~01m 12s
|++++++++++++++++++++++ | 43% ~01m 11s
|++++++++++++++++++++++ | 44% ~01m 10s
|+++++++++++++++++++++++ | 45% ~01m 09s
|+++++++++++++++++++++++ | 46% ~01m 07s
|++++++++++++++++++++++++ | 47% ~01m 06s
|++++++++++++++++++++++++ | 48% ~01m 05s
|+++++++++++++++++++++++++ | 49% ~01m 04s
|+++++++++++++++++++++++++ | 50% ~01m 02s
|++++++++++++++++++++++++++ | 51% ~01m 01s
|++++++++++++++++++++++++++ | 52% ~01m 00s
|+++++++++++++++++++++++++++ | 53% ~59s
|+++++++++++++++++++++++++++ | 54% ~58s
|++++++++++++++++++++++++++++ | 55% ~56s
|++++++++++++++++++++++++++++ | 56% ~55s
|+++++++++++++++++++++++++++++ | 57% ~54s
|+++++++++++++++++++++++++++++ | 58% ~53s
|++++++++++++++++++++++++++++++ | 59% ~51s
|++++++++++++++++++++++++++++++ | 60% ~50s
|+++++++++++++++++++++++++++++++ | 61% ~49s
|+++++++++++++++++++++++++++++++ | 62% ~48s
|++++++++++++++++++++++++++++++++ | 63% ~46s
|++++++++++++++++++++++++++++++++ | 64% ~45s
|+++++++++++++++++++++++++++++++++ | 65% ~44s
|+++++++++++++++++++++++++++++++++ | 66% ~43s
|++++++++++++++++++++++++++++++++++ | 67% ~41s
|++++++++++++++++++++++++++++++++++ | 68% ~40s
|+++++++++++++++++++++++++++++++++++ | 69% ~39s
|+++++++++++++++++++++++++++++++++++ | 70% ~38s
|++++++++++++++++++++++++++++++++++++ | 71% ~36s
|++++++++++++++++++++++++++++++++++++ | 72% ~35s
|+++++++++++++++++++++++++++++++++++++ | 73% ~34s
|+++++++++++++++++++++++++++++++++++++ | 74% ~33s
|++++++++++++++++++++++++++++++++++++++ | 75% ~31s
|++++++++++++++++++++++++++++++++++++++ | 76% ~30s
|+++++++++++++++++++++++++++++++++++++++ | 77% ~29s
|+++++++++++++++++++++++++++++++++++++++ | 78% ~28s
|++++++++++++++++++++++++++++++++++++++++ | 79% ~26s
|++++++++++++++++++++++++++++++++++++++++ | 80% ~25s
|+++++++++++++++++++++++++++++++++++++++++ | 81% ~24s
|+++++++++++++++++++++++++++++++++++++++++ | 82% ~23s
|++++++++++++++++++++++++++++++++++++++++++ | 83% ~21s
|++++++++++++++++++++++++++++++++++++++++++ | 84% ~20s
|+++++++++++++++++++++++++++++++++++++++++++ | 85% ~19s
|+++++++++++++++++++++++++++++++++++++++++++ | 86% ~18s
|++++++++++++++++++++++++++++++++++++++++++++ | 87% ~16s
|++++++++++++++++++++++++++++++++++++++++++++ | 88% ~15s
|+++++++++++++++++++++++++++++++++++++++++++++ | 89% ~14s
|+++++++++++++++++++++++++++++++++++++++++++++ | 90% ~13s
|++++++++++++++++++++++++++++++++++++++++++++++ | 91% ~11s
|++++++++++++++++++++++++++++++++++++++++++++++ | 92% ~10s
|+++++++++++++++++++++++++++++++++++++++++++++++ | 93% ~09s
|+++++++++++++++++++++++++++++++++++++++++++++++ | 94% ~08s
|++++++++++++++++++++++++++++++++++++++++++++++++ | 95% ~06s
|++++++++++++++++++++++++++++++++++++++++++++++++ | 96% ~05s
|+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~04s
|+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~03s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~01s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed = 02m 05s
DE_P4_basal_genotype
write.table(DE_P4_basal_genotype,"DE_P4_basal_genotype.txt",sep="\t")
P4_bassal_automatic_geneList<-DE_P4_basal_genotype$gene[DE_P4_basal_genotype$p_val_adj<0.001 & abs(DE_P4_basal_genotype$avg_logFC)>0.5 & abs(DE_P4_basal_genotype$pct.1-DE_P4_basal_genotype$pct.2)>0.15]
library(ggrepel)

DE_P4_secretory_genotype<-FindMarkers(P4_Oct18_epi,cells.1<-WhichCells(object=P4_Oct18_epi,cells.use = (P4_Oct18_epi@meta.data$genotype=="wt" & P4_Oct18_epi@meta.data$cell_type=="Secretory" )),cells.2<-WhichCells(object=P4_Oct18_epi,cells.use = (P4_Oct18_epi@meta.data$genotype=="mut" & P4_Oct18_epi@meta.data$cell_type=="Secretory" )),only.pos = F,logfc.threshold=0,min.pct=0.05)
| | 0 % ~calculating
|+ | 1 % ~05m 56s
|+ | 2 % ~05m 59s
|++ | 3 % ~05m 51s
|++ | 4 % ~05m 46s
|+++ | 5 % ~05m 45s
|+++ | 6 % ~05m 39s
|++++ | 7 % ~05m 34s
|++++ | 8 % ~05m 32s
|+++++ | 9 % ~05m 27s
|+++++ | 10% ~05m 25s
|++++++ | 11% ~05m 20s
|++++++ | 12% ~05m 16s
|+++++++ | 13% ~05m 13s
|+++++++ | 14% ~05m 09s
|++++++++ | 15% ~05m 05s
|++++++++ | 16% ~05m 01s
|+++++++++ | 17% ~04m 57s
|+++++++++ | 18% ~04m 54s
|++++++++++ | 19% ~04m 50s
|++++++++++ | 20% ~04m 47s
|+++++++++++ | 21% ~04m 44s
|+++++++++++ | 22% ~04m 41s
|++++++++++++ | 23% ~04m 37s
|++++++++++++ | 24% ~04m 33s
|+++++++++++++ | 25% ~04m 29s
|+++++++++++++ | 26% ~04m 26s
|++++++++++++++ | 27% ~04m 22s
|++++++++++++++ | 28% ~04m 18s
|+++++++++++++++ | 29% ~04m 15s
|+++++++++++++++ | 30% ~04m 11s
|++++++++++++++++ | 31% ~04m 08s
|++++++++++++++++ | 32% ~04m 04s
|+++++++++++++++++ | 33% ~04m 01s
|+++++++++++++++++ | 34% ~03m 57s
|++++++++++++++++++ | 35% ~03m 54s
|++++++++++++++++++ | 36% ~03m 50s
|+++++++++++++++++++ | 37% ~03m 47s
|+++++++++++++++++++ | 38% ~03m 43s
|++++++++++++++++++++ | 39% ~03m 40s
|++++++++++++++++++++ | 40% ~03m 36s
|+++++++++++++++++++++ | 41% ~03m 32s
|+++++++++++++++++++++ | 42% ~03m 29s
|++++++++++++++++++++++ | 43% ~03m 25s
|++++++++++++++++++++++ | 44% ~03m 22s
|+++++++++++++++++++++++ | 45% ~03m 19s
|+++++++++++++++++++++++ | 46% ~03m 15s
|++++++++++++++++++++++++ | 47% ~03m 12s
|++++++++++++++++++++++++ | 48% ~03m 08s
|+++++++++++++++++++++++++ | 49% ~03m 05s
|+++++++++++++++++++++++++ | 50% ~03m 01s
|++++++++++++++++++++++++++ | 51% ~02m 57s
|++++++++++++++++++++++++++ | 52% ~02m 54s
|+++++++++++++++++++++++++++ | 53% ~02m 50s
|+++++++++++++++++++++++++++ | 54% ~02m 47s
|++++++++++++++++++++++++++++ | 55% ~02m 43s
|++++++++++++++++++++++++++++ | 56% ~02m 39s
|+++++++++++++++++++++++++++++ | 57% ~02m 36s
|+++++++++++++++++++++++++++++ | 58% ~02m 32s
|++++++++++++++++++++++++++++++ | 59% ~02m 29s
|++++++++++++++++++++++++++++++ | 60% ~02m 25s
|+++++++++++++++++++++++++++++++ | 61% ~02m 22s
|+++++++++++++++++++++++++++++++ | 62% ~02m 18s
|++++++++++++++++++++++++++++++++ | 63% ~02m 14s
|++++++++++++++++++++++++++++++++ | 64% ~02m 11s
|+++++++++++++++++++++++++++++++++ | 65% ~02m 07s
|+++++++++++++++++++++++++++++++++ | 66% ~02m 03s
|++++++++++++++++++++++++++++++++++ | 67% ~01m 59s
|++++++++++++++++++++++++++++++++++ | 68% ~01m 56s
|+++++++++++++++++++++++++++++++++++ | 69% ~01m 52s
|+++++++++++++++++++++++++++++++++++ | 70% ~01m 48s
|++++++++++++++++++++++++++++++++++++ | 71% ~01m 45s
|++++++++++++++++++++++++++++++++++++ | 72% ~01m 41s
|+++++++++++++++++++++++++++++++++++++ | 73% ~01m 38s
|+++++++++++++++++++++++++++++++++++++ | 74% ~01m 34s
|++++++++++++++++++++++++++++++++++++++ | 75% ~01m 30s
|++++++++++++++++++++++++++++++++++++++ | 76% ~01m 27s
|+++++++++++++++++++++++++++++++++++++++ | 77% ~01m 23s
|+++++++++++++++++++++++++++++++++++++++ | 78% ~01m 19s
|++++++++++++++++++++++++++++++++++++++++ | 79% ~01m 16s
|++++++++++++++++++++++++++++++++++++++++ | 80% ~01m 12s
|+++++++++++++++++++++++++++++++++++++++++ | 81% ~01m 09s
|+++++++++++++++++++++++++++++++++++++++++ | 82% ~01m 05s
|++++++++++++++++++++++++++++++++++++++++++ | 83% ~01m 01s
|++++++++++++++++++++++++++++++++++++++++++ | 84% ~58s
|+++++++++++++++++++++++++++++++++++++++++++ | 85% ~54s
|+++++++++++++++++++++++++++++++++++++++++++ | 86% ~50s
|++++++++++++++++++++++++++++++++++++++++++++ | 87% ~47s
|++++++++++++++++++++++++++++++++++++++++++++ | 88% ~43s
|+++++++++++++++++++++++++++++++++++++++++++++ | 89% ~40s
|+++++++++++++++++++++++++++++++++++++++++++++ | 90% ~36s
|++++++++++++++++++++++++++++++++++++++++++++++ | 91% ~32s
|++++++++++++++++++++++++++++++++++++++++++++++ | 92% ~29s
|+++++++++++++++++++++++++++++++++++++++++++++++ | 93% ~25s
|+++++++++++++++++++++++++++++++++++++++++++++++ | 94% ~22s
|++++++++++++++++++++++++++++++++++++++++++++++++ | 95% ~18s
|++++++++++++++++++++++++++++++++++++++++++++++++ | 96% ~14s
|+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~11s
|+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~07s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~04s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed = 05m 57s
DE_P4_secretory_genotype
write.table(DE_P4_secretory_genotype,"DE_P4_secretory_genotype.txt",sep="\t")
P4_sec_automatic_geneList<-DE_P4_secretory_genotype$gene[DE_P4_secretory_genotype$p_val_adj<0.001 & abs(DE_P4_secretory_genotype$avg_logFC)>0.5 & abs(DE_P4_secretory_genotype$pct.1-DE_P4_secretory_genotype$pct.2)>0.15]
library(ggrepel)
DE_P4_secretory_genotype$gene<-rownames(DE_P4_secretory_genotype)
DE_P4_secretory_genotype$sig<-DE_P4_secretory_genotype$p_val_adj<0.001
volc = ggplot(DE_P4_secretory_genotype, aes(avg_logFC, -log10(p_val_adj))) + #volcanoplot with avg_logFC versus p_val_adj
geom_point(aes(col=sig),size=0.1) + #add points colored by significance
scale_color_manual(values=c("black", "red")) +
ggtitle("P4secretory_wt/mut") + geom_text_repel(data=DE_P4_secretory_genotype[DE_P4_secretory_genotype$gene %in% P4_sec_automatic_geneList,], aes(label=gene), point.padding = 1, box.padding = .3) +
labs(y = expression(-log[10]*" "*"adjusted pvalue"), x = "avg log fold change") +
theme(legend.title = element_blank(), legend.position = "top") +
scale_fill_discrete(labels = c("Not Sig", "adjusted pval < 0.001"))

P4_sec_geneList<-c("Itln1","Retnla","Chil4","Clca1","Cxcl15","Fcgbp","Nfkbia","Hspa5","Ly6k","Ifrd1","Gm42418","Cxcl2","Nfkbiz","Lcn2","Igfbp3","Crip1","Selenbp1","Tppp3","Lyz2","S100a6","Plac8","AU040972","Klk10","Lyz1","Ly6a","Lgals3","Cxcl17","F3","Krt7","Cp","Tsc22d3","Mt1","Chil1","Krt4","Ptprz1","Ifitm1","Txnip","S100a10","Ly6g6c","Hes1","Cldn3","Klk11","Slpi","Baiap2","Plet1","Scnn1a","Lbp","Ltf","Ptges","Muc4","Atp1b1","Atp7b","Ptp4a1","AA467197")

Interleukins:
VlnPlot(object = P4_Oct18_epi, features.plot = c("Il10","Il11","Il12a","Il13","Il15","Il16","Il17a","Il17b","Il17c","Il17d","Il17f","Il18","Il2","Il21","Il22","Il24","Il25","Il27","Il33","Il34","Il4","Il5","Il6","Il7","Il1a","Il1b","Il31"), nCol = 6,x.lab.rot = T,point.size.use = 0.2,group.by="cell_type", legend.position = "left")
All cells have the same value of feature.All cells have the same value of feature.All cells have the same value of feature.All cells have the same value of feature.All cells have the same value of feature.All cells have the same value of feature.All cells have the same value of feature.All cells have the same value of feature.

Interferons: very few are expressed
VlnPlot(object = P4_Oct18_epi, features.plot = grep("Ifn",rownames(P4_Oct18_epi@data),value=T), nCol = 3,x.lab.rot = T,point.size.use = 0.2,group.by="cell_type", legend.position = "left")
All cells have the same value of feature.

antimicrobial effectors: wt vs mut

P4_Oct18_epi@meta.data$type_genotype<-as.factor(paste(P4_Oct18_epi@meta.data$cell_type,P4_Oct18_epi@meta.data$genotype,sep="_"))


P4_Oct18_epi<-SetAllIdent(object = P4_Oct18_epi, id = "type_genotype")
P4_Oct18_epi@ident=factor(P4_Oct18_epi@ident,levels(P4_Oct18_epi@ident)[c(1,2,7,8,5,6,3,4)])
DotPlot(object = P4_Oct18_epi, cols.use = c("yellow","red"),genes.plot = rev(c("Nfkbia","Nfkbiz","Retnla","Cxcl17","Cxcl15","Ccl20","Areg","Chil4","Muc5b","Muc4","Pigr","Ltf","Lyz2","Slpi","Lcn2","Sftpd","Sftpb","Defb1","Lgals3","Itln1")),x.lab.rot = T,plot.legend = T,group.by = "ident",do.return=T)+rotate()+ theme(axis.text.x = element_text(angle = 45, vjust = 1,hjust=1)) #this scales both genotypes together


df_P4_epi<-FetchData(P4_Oct18_epi,c("Spdef","Creb3l1","Scgb3a2","Scgb1a1","Krt4","Krt13","Foxa3","Aqp3","Aqp4","Aqp5","Gp2","Sostdc1","Smoc2","Krt14","Krt15","Krt5","Rac2","Clic3","res.0.8","genotype","seq_group","specific_type","cell_type","Defb1","Lyz2","Ltf","Sftpa1","Sftpd","Sftpb","Slpi","Lcn2","Pigr","Muc5b","Muc5ac","Chil4","Muc1","Muc2","Muc4","Muc16","Muc20","Lbp","Cd14","Tlr4","Tlr2","Myd88","Ticam1","Itln1","Lgals3","Reg3g","Nod1","Nod2","Ddx58","Ifih1","Dhx58","Ccl5","Cxcl10","Cxcl2","Cxcl1","Pf4","Cxcl12","Cxcl14","Cxcl15","Cxcl16","Cxcl17","Ccl2","Ccl7","Ccl17","Ccl20","Ccl21a","Ccl25","Ccl27a","Ccl28","Cx3cl1","Il10","Tnf","S100a8","S100a9","Il6","Il18","Il1b","Il1rl1","Ccl11","Ccl24","Il33","Il25","Tslp","F2rl1","Retnla","Alox15","Alox5","Gata2","Tgfb2","Tgfb1","Ormdl3","Ptges","Ptgds","Ptgs2","Hpgds","Tbxas1","Areg","Il2","Il34","Il15","Ifnlr1","Nfkbiz","Nfkbia"))
MicrobialSensing:
for (i in c("Lbp","Cd14","Tlr4","Tlr2","Myd88","Ticam1","Itln1","Reg3g","Lgals3","Nod1","Nod2","Ddx58","Ifih1","Dhx58"))
{
pdf(file = paste("Manuscript/MicrobialSensing_genotype/P4/",i,".pdf", sep = ""), width = 6, height = 5)
print(ggplot(df_P4_epi,aes_string(x="genotype",y=i))+facet_grid(.~cell_type)+geom_dotplot(binaxis="y",aes(fill=genotype),binwidth=0.05,stackdir="center",position=position_dodge(0.8), dotsize=0.2)+stat_compare_means(comparisons = list(c("wt", "mut")),method="wilcox.test",size=4,label="p.adj")+ stat_summary(aes(color=genotype),fun.data=mean_sdl, fun.args = list(mult=1),
geom="pointrange",position=position_dodge(0.7))+ theme(axis.text.x = element_text(angle = 45,hjust=1),strip.text.x = element_text(size = 9, colour = "black", angle = 0)))
dev.off()
}
antimicrobial effectors:
for (i in c("Muc1","Muc4","Muc16","Muc20","Muc5b","Muc5ac","Muc2","Defb1","Lyz2","Ltf","Sftpa1","Sftpd","Sftpb","Slpi","Lcn2","Pigr","Chil4"))
{
pdf(file = paste("Manuscript/Effectors_genotype/P4/",i,".pdf", sep = ""), width = 6, height = 5)
print(ggplot(df_P4_epi,aes_string(x="genotype",y=i))+facet_grid(.~cell_type)+geom_dotplot(binaxis="y",aes(fill=genotype),binwidth=0.05,stackdir="center",position=position_dodge(0.8), dotsize=0.2)+stat_compare_means(comparisons = list(c("wt", "mut")),method="wilcox.test",size=4,label="p.adj")+ stat_summary(aes(color=genotype),fun.data=mean_sdl, fun.args = list(mult=1),
geom="pointrange",position=position_dodge(0.7))+ theme(axis.text.x = element_text(angle = 45,hjust=1),strip.text.x = element_text(size = 9, colour = "black", angle = 0)))
dev.off()
}
chemokines:
for (i in c("Ccl5","Cxcl10","Cxcl2","Cxcl1","Pf4","Cxcl12","Cxcl14","Cxcl15","Cxcl16","Cxcl17","Ccl2","Ccl7","Ccl17","Ccl20","Ccl21a","Ccl25","Ccl27a","Ccl28","Cx3cl1"))
{
pdf(file = paste("Manuscript/chemokines_genotype/P4/",i,".pdf", sep = ""), width = 6, height = 5)
print(ggplot(df_P4_epi,aes_string(x="genotype",y=i))+facet_grid(.~cell_type)+geom_dotplot(binaxis="y",aes(fill=genotype),binwidth=0.05,stackdir="center",position=position_dodge(0.8), dotsize=0.2)+stat_compare_means(comparisons = list(c("wt", "mut")),method="wilcox.test",size=4,label="p.adj")+ stat_summary(aes(color=genotype),fun.data=mean_sdl, fun.args = list(mult=1),
geom="pointrange",position=position_dodge(0.7))+ theme(axis.text.x = element_text(angle = 45,hjust=1),strip.text.x = element_text(size = 9, colour = "black", angle = 0)))
dev.off()
}
Th2:
for (i in c("Il10","Tnf","S100a8","S100a9","Il6","Il18","Il1b","Il1rl1","Ccl11","Ccl24","Il33","Il25","Tslp","F2rl1","Retnla","Alox15","Alox5","Gata2","Tgfb2","Tgfb1","Ormdl3","Ptges","Ptgds","Ptgs2","Hpgds","Tbxas1","Areg"))
{
pdf(file = paste("Manuscript/Th2_genotype/P4/",i,".pdf", sep = ""), width = 6, height = 5)
print(ggplot(df_P4_epi,aes_string(x="genotype",y=i))+facet_grid(.~cell_type)+geom_dotplot(binaxis="y",aes(fill=genotype),binwidth=0.05,stackdir="center",position=position_dodge(0.8), dotsize=0.2)+stat_compare_means(comparisons = list(c("wt", "mut")),method="wilcox.test",size=4,label="p.adj")+ stat_summary(aes(color=genotype),fun.data=mean_sdl, fun.args = list(mult=1),
geom="pointrange",position=position_dodge(0.7))+ theme(axis.text.x = element_text(angle = 45,hjust=1),strip.text.x = element_text(size = 9, colour = "black", angle = 0)))
dev.off()
}
















res.used <- 1.2
P4_Oct18_epi <- FindClusters(object = P4_Oct18_epi, reduction.type = "pca", dims.use = 1:n.pcs.sub,
resolution = res.used, print.output = 0, force.recalc = T)
P4_Oct18_epi <- RunTSNE(object = P4_Oct18_epi, dims.use = 1:n.pcs.sub, perplexity=30)
TSNEPlot(object = P4_Oct18_epi, do.label = T,pt.size = 0.4,group.by="res.1.2")


table(P4_Oct18_epi@meta.data$res.0.8,P4_Oct18_epi@meta.data$res.1.2)
0 1 10 11 2 3 4 5 6 7 8 9
0 311 0 0 0 0 0 0 1 0 3 0 0
1 0 0 0 0 0 192 0 1 0 0 0 109
2 0 0 0 33 205 0 0 0 0 0 0 0
3 0 226 1 0 0 1 0 0 1 0 0 0
4 0 0 2 0 0 0 185 0 0 0 0 0
5 0 0 0 0 0 0 0 169 0 0 0 2
6 0 0 0 0 0 0 0 0 152 0 0 0
7 0 0 0 0 0 0 0 0 0 136 0 0
8 0 0 0 0 0 0 0 0 0 0 135 0
9 0 0 97 0 0 0 0 0 0 0 0 0
res.used <- 1.4
P4_Oct18_epi <- FindClusters(object = P4_Oct18_epi, reduction.type = "pca", dims.use = 1:n.pcs.sub,
resolution = res.used, print.output = 0, force.recalc = T)
P4_Oct18_epi <- RunTSNE(object = P4_Oct18_epi, dims.use = 1:n.pcs.sub, perplexity=30)
TSNEPlot(object = P4_Oct18_epi, do.label = T,pt.size = 0.4,group.by="res.1.4")


table(P4_Oct18_epi@meta.data$res.0.8,P4_Oct18_epi@meta.data$res.1.4)
0 1 10 11 12 13 2 3 4 5 6 7 8 9
0 0 0 0 0 0 0 0 0 172 2 141 0 0 0
1 0 0 0 0 0 0 191 0 0 1 0 0 0 110
2 0 205 0 0 0 33 0 0 0 0 0 0 0 0
3 224 0 1 0 1 0 1 0 1 0 1 0 0 0
4 0 0 2 0 0 0 0 185 0 0 0 0 0 0
5 0 0 0 0 0 0 0 0 0 169 0 0 0 2
6 0 0 0 89 63 0 0 0 0 0 0 0 0 0
7 0 0 0 0 0 0 0 0 0 0 0 136 0 0
8 0 0 0 0 0 0 0 0 0 0 0 0 135 0
9 0 0 97 0 0 0 0 0 0 0 0 0 0 0
table(P4_Oct18_epi@meta.data$genotype,P4_Oct18_epi@meta.data$res.1.4)
0 1 10 11 12 13 2 3 4 5 6 7 8 9
mut 223 135 46 78 64 24 191 117 5 107 3 2 65 110
wt 1 70 54 11 0 9 1 68 168 65 139 134 70 2
P4_Oct18_epi@meta.data$specific_type<-mapvalues(P4_Oct18_epi@meta.data$res.0.8,from=c("0","1","2","3","4","5","6","7","8","9"),to=c("Secretory","Secretory-Krt4","Ciliated","Secretory-Krt4","CiliaSecretory","Secretory-Krt4","Basal","Basal","Ciliated","Ciliated-Foxn4"))

P4_Oct18_epi@meta.data$specific_type_1.4<-mapvalues(P4_Oct18_epi@meta.data$res.1.4,from=c("0","1","2","3","4","5","6","7","8","9","10","11","12","13"),to=c("Secretory","Ciliated","Secretory","CiliaSecretory","Secretory","CyclingSecretory","Secretory","Basal-Sostdc1","Ciliated","Secretory-Krt4","Ciliated","CyclingBasal","Basal","Ciliated"))
to support this identification:


table(P4_Oct18_epi@meta.data$specific_type_1.4,P4_Oct18_epi@meta.data$genotype)
mut wt
Basal 64 0
Basal-Sostdc1 2 134
CiliaSecretory 117 68
Ciliated 270 203
CyclingBasal 78 11
CyclingSecretory 107 65
Secretory 422 309
Secretory-Krt4 110 2

LS0tCnRpdGxlOiAiUDRfVHJhY2hlYV8xMFhfZXBpdGhlbGlhbCIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQojIyMjIyBQNCB0cmFjaGVhIHNhbXBsZSBjb2xsZWN0ZWQgb24gT2N0MTggMjAxOC4gZXBpdGhlbGlhbCBzdWJzZXQKYGBge3J9CmxpYnJhcnkoU2V1cmF0KQpsaWJyYXJ5KGRwbHlyKQpgYGAKCiMjIyMjIGJhc2FsLCBzZWNyZXRvcnksIGFuZCBjaWxpYXRlZDoKYGBge3J9ClA0XzEwWF9tbTEwXzEuMi4wIDwtIFNldEFsbElkZW50KG9iamVjdCA9IFA0XzEwWF9tbTEwXzEuMi4wLCBpZCA9ICJyZXMuMC44IikKUDRfT2N0MThfZXBpPC1TdWJzZXREYXRhKG9iamVjdD1QNF8xMFhfbW0xMF8xLjIuMCxpZGVudC51c2U9YygxOjUsOCwxMSkpCnRhYmxlKFA0X09jdDE4X2VwaUBtZXRhLmRhdGEkcmVzLjAuOCxQNF9PY3QxOF9lcGlAbWV0YS5kYXRhJHNlcV9ncm91cCkKYGBgCmBgYHtyfQpjb2xuYW1lcyhQNF9PY3QxOF9lcGlAbWV0YS5kYXRhKVtjb2xuYW1lcyhQNF9PY3QxOF9lcGlAbWV0YS5kYXRhKSA9PSAncmVzLjAuOCddIDwtICdvcmlnLjAuOCcKClA0X09jdDE4X2VwaSA8LSBTY2FsZURhdGEob2JqZWN0ID0gUDRfT2N0MThfZXBpKQpgYGAKCmBgYHtyfQpQNF9PY3QxOF9lcGkgPC0gRmluZFZhcmlhYmxlR2VuZXMob2JqZWN0ID0gUDRfT2N0MThfZXBpLCBkby5wbG90ID0gVFJVRSwgeC5sb3cuY3V0b2ZmPTAuMSx4LmhpZ2guY3V0b2ZmID0gSW5mLCB5LmN1dG9mZiA9IDAuNSkKYGBgCiMjIyMjI3J1biBQQ0Egb24gdGhlIHNldCBvZiBnZW5lcwpgYGB7cn0KUDRfT2N0MThfZXBpIDwtIFJ1blBDQShvYmplY3QgPSBQNF9PY3QxOF9lcGksIGRvLnByaW50ID0gRkFMU0UpClBDQVBsb3QoUDRfT2N0MThfZXBpKQpgYGAKCmBgYHtyfQpQNF9PY3QxOF9lcGkgPC0gUHJvamVjdFBDQShvYmplY3QgPSBQNF9PY3QxOF9lcGksIGRvLnByaW50ID0gRikKYGBgCgpgYGB7cn0KUENFbGJvd1Bsb3Qob2JqZWN0ID0gUDRfT2N0MThfZXBpKQpgYGAKYGBge3IsZmlnLmhlaWdodD01MCxmaWcud2lkdGg9MTV9ClBDSGVhdG1hcChvYmplY3QgPSBQNF9PY3QxOF9lcGksIHBjLnVzZSA9IDE6MjAsIGNlbGxzLnVzZSA9IDUwMCwgZG8uYmFsYW5jZWQgPSBUUlVFLCBsYWJlbC5jb2x1bW5zID0gRkFMU0UsIG51bS5nZW5lcyA9IDI1KQoKYGBgCgoKYGBge3J9Cm4ucGNzLnN1YiA9IDE2CmBgYApgYGB7cn0KcmVzLnVzZWQgPC0gMC44CmBgYAoKYGBge3J9ClA0X09jdDE4X2VwaSA8LSBGaW5kQ2x1c3RlcnMob2JqZWN0ID0gUDRfT2N0MThfZXBpLCByZWR1Y3Rpb24udHlwZSA9ICJwY2EiLCBkaW1zLnVzZSA9IDE6bi5wY3Muc3ViLCAKICAgICAgICAgICAgICAgICAgICAgcmVzb2x1dGlvbiA9IHJlcy51c2VkLCBwcmludC5vdXRwdXQgPSAwLCBmb3JjZS5yZWNhbGMgPSBUKQpgYGAKYGBge3J9ClA0X09jdDE4X2VwaSA8LSBSdW5UU05FKG9iamVjdCA9IFA0X09jdDE4X2VwaSwgZGltcy51c2UgPSAxOm4ucGNzLnN1YiwgcGVycGxleGl0eT0zMCkKYGBgCmBgYHtyLCBmaWcud2lkdGg9MTAsZmlnLmhlaWdodD02fQpUU05FUGxvdChvYmplY3QgPSBQNF9PY3QxOF9lcGksIGRvLmxhYmVsID0gVCxwdC5zaXplID0gMC40LGdyb3VwLmJ5PSJyZXMuMC44IikKYGBgCmBgYHtyfQpUU05FUGxvdChvYmplY3QgPSBQNF9PY3QxOF9lcGksIGRvLmxhYmVsID0gRixncm91cC5ieT0iZ2Vub3R5cGUiLHB0LnNpemUgPSAwLjQpCmBgYAoKYGBge3IsZmlnLmhlaWdodD04LGZpZy53aWR0aD00MH0KCkRvSGVhdG1hcChvYmplY3QgPSBQNF9PY3QxOF9lcGksIGdlbmVzLnVzZSA9IGMoIkVwY2FtIiwiVHJwNjMiLCJLcnQ1IiwiS3J0MTQiLCJTb3N0ZGMxIiwiTWtpNjciLCJUb3AyYSIsIktydDQiLCJLcnQxMyIsIlNwZGVmIiwiQ3JlYjNsMSIsIk11YzVhYyIsIkdwMiIsIkdhbG50NiIsIlB0Z2RyIiwiQ2QxNzciLCJGb3hqMSIsIkZveG40IiwiU2hpc2E4IiksIAogICAgc2xpbS5jb2wubGFiZWwgPSBUUlVFLCBncm91cC5sYWJlbC5yb3QgPSBUUlVFLHVzZS5zY2FsZWQgPSBULGdyb3VwLmJ5ID0gInJlcy4wLjgiLGNleC5yb3cgPSAyNSxncm91cC5jZXggPSAzMAogICkKYGBgCgpgYGB7cn0KUDRfT2N0MThfZXBpQG1ldGEuZGF0YSRjZWxsX3R5cGU8LW1hcHZhbHVlcyhQNF9PY3QxOF9lcGlAbWV0YS5kYXRhJHJlcy4wLjgsZnJvbT1jKCIwIiwiMSIsIjIiLCIzIiwiNCIsIjUiLCI2IiwiNyIsIjgiLCI5IiksdG89YygiU2VjcmV0b3J5IiwiU2VjcmV0b3J5IiwiQ2lsaWF0ZWQiLCJTZWNyZXRvcnkiLCJDaWxpYVNlY3JldG9yeSIsIlNlY3JldG9yeSIsIkJhc2FsIiwiQmFzYWwiLCJDaWxpYXRlZCIsIkNpbGlhdGVkIikpCmBgYAoKYGBge3J9ClA0X2VwaV9jZWxsVHlwZTwtUDRfT2N0MThfZXBpQG1ldGEuZGF0YSRjZWxsX3R5cGUKbmFtZXMoUDRfZXBpX2NlbGxUeXBlKTwtUDRfT2N0MThfZXBpQGNlbGwubmFtZXMKI3RoaXMgd2lsbCBiZSB1c2VkIGluIFA0T2N0X21tMTBfMV8yXzBfRUMyLlJtZApgYGAKYGBge3IsZmlnLndpZHRoPTUsZmlnLmhlaWdodD01fQpnZ3Bsb3QoZGF0YT1QNF9PY3QxOF9lcGlAbWV0YS5kYXRhLGFlcyhnZW5vdHlwZSxmaWxsPWNlbGxfdHlwZSkpKyAKICAgIGdlb21fYmFyKHBvc2l0aW9uPSJmaWxsIikrIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkpCmBgYApgYGB7cn0KdGFibGUoUDRfT2N0MThfZXBpQG1ldGEuZGF0YSRjZWxsX3R5cGUsUDRfT2N0MThfZXBpQG1ldGEuZGF0YSRnZW5vdHlwZSkKYGBgCiMjIyMjIGNvbXBhcmUgYmV0d2VlbiBnZW5vdHlwZXM6CmBgYHtyfQpERV9QNF9jaWxpYXRlZF9nZW5vdHlwZTwtRmluZE1hcmtlcnMoUDRfT2N0MThfZXBpLGNlbGxzLjE8LVdoaWNoQ2VsbHMob2JqZWN0PVA0X09jdDE4X2VwaSxjZWxscy51c2UgPSAoUDRfT2N0MThfZXBpQG1ldGEuZGF0YSRnZW5vdHlwZT09Ind0IiAmIFA0X09jdDE4X2VwaUBtZXRhLmRhdGEkY2VsbF90eXBlPT0iQ2lsaWF0ZWQiICkpLGNlbGxzLjI8LVdoaWNoQ2VsbHMob2JqZWN0PVA0X09jdDE4X2VwaSxjZWxscy51c2UgPSAoUDRfT2N0MThfZXBpQG1ldGEuZGF0YSRnZW5vdHlwZT09Im11dCIgJiBQNF9PY3QxOF9lcGlAbWV0YS5kYXRhJGNlbGxfdHlwZT09IkNpbGlhdGVkIiApKSxvbmx5LnBvcyA9IEYsbG9nZmMudGhyZXNob2xkPTAsbWluLnBjdD0wLjA1KQpERV9QNF9jaWxpYXRlZF9nZW5vdHlwZQpgYGAKCmBgYHtyfQp3cml0ZS50YWJsZShERV9QNF9jaWxpYXRlZF9nZW5vdHlwZSwiREVfUDRfY2lsaWF0ZWRfZ2Vub3R5cGUudHh0IixzZXA9Ilx0IikKYGBgCgoKYGBge3J9ClA0X2NpbGlhdGVkX2F1dG9tYXRpY19nZW5lTGlzdDwtREVfUDRfY2lsaWF0ZWRfZ2Vub3R5cGUkZ2VuZVtERV9QNF9jaWxpYXRlZF9nZW5vdHlwZSRwX3ZhbF9hZGo8MC4wMDEgJiBhYnMoREVfUDRfY2lsaWF0ZWRfZ2Vub3R5cGUkYXZnX2xvZ0ZDKT4wLjUgJiBhYnMoREVfUDRfY2lsaWF0ZWRfZ2Vub3R5cGUkcGN0LjEtREVfUDRfY2lsaWF0ZWRfZ2Vub3R5cGUkcGN0LjIpPjAuMTVdCmBgYApgYGB7cn0KbGlicmFyeShnZ3JlcGVsKQpgYGAKYGBge3IsZmlnLmhlaWdodD04LGZpZy53aWR0aD0xMn0KREVfUDRfY2lsaWF0ZWRfZ2Vub3R5cGUkZ2VuZTwtcm93bmFtZXMoREVfUDRfY2lsaWF0ZWRfZ2Vub3R5cGUpCiNERV9QNF9zZWNyZXRvcnlfZ2Vub3R5cGUkc2lnPC1ERV9QNF9zZWNyZXRvcnlfZ2Vub3R5cGUkcF92YWxfYWRqPDAuMDAxCkRFX1A0X2NpbGlhdGVkX2dlbm90eXBlJHRocmVzaG9sZDwtIGlmZWxzZShERV9QNF9jaWxpYXRlZF9nZW5vdHlwZSRhdmdfbG9nRkM+MCAmIERFX1A0X2NpbGlhdGVkX2dlbm90eXBlJHBfdmFsX2FkajwwLjAwMSwgInd0X2VucmljaCIsaWZlbHNlKERFX1A0X2NpbGlhdGVkX2dlbm90eXBlJGF2Z19sb2dGQzwwICYgREVfUDRfY2lsaWF0ZWRfZ2Vub3R5cGUkcF92YWxfYWRqPDAuMDAxLCAibXV0X2VucmljaCIsIk5vdFNpZ25pZmljYW50IiApICkKZ2dwbG90KERFX1A0X2NpbGlhdGVkX2dlbm90eXBlLCBhZXMoYXZnX2xvZ0ZDLCAtbG9nMTAocF92YWxfYWRqKSkpICsgI3ZvbGNhbm9wbG90IHdpdGggYXZnX2xvZ0ZDIHZlcnN1cyBwX3ZhbF9hZGoKICAgIGdlb21fcG9pbnQoYWVzKGNvbD10aHJlc2hvbGQpLHNpemU9MC4yKSArICNhZGQgcG9pbnRzIGNvbG9yZWQgYnkgc2lnbmlmaWNhbmNlCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jKCJncmVlbiIsICJibGFjayIsIm1hZ2VudGEiKSkrCiAgICBnZ3RpdGxlKCJQNENpbGlhdGVkX3d0L211dCIpICsgZ2VvbV90ZXh0X3JlcGVsKGRhdGE9REVfUDRfY2lsaWF0ZWRfZ2Vub3R5cGVbREVfUDRfY2lsaWF0ZWRfZ2Vub3R5cGUkZ2VuZSAlaW4lIFA0X2NpbGlhdGVkX2F1dG9tYXRpY19nZW5lTGlzdCxdLCBhZXMobGFiZWw9Z2VuZSksIHBvaW50LnBhZGRpbmcgPSAxLCBib3gucGFkZGluZyA9IC4zKSArCiAgbGFicyh5ID0gZXhwcmVzc2lvbigtbG9nWzEwXSoiICIqImFkanVzdGVkIHB2YWx1ZSIpLCB4ID0gImF2ZyBsb2cgZm9sZCBjaGFuZ2UiKSArIAogIHRoZW1lKGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSwgbGVnZW5kLnBvc2l0aW9uID0gInRvcCIpIApgYGAKCmBgYHtyLGZpZy5oZWlnaHQ9OCxmaWcud2lkdGg9MTJ9CkRFX1A0X2NpbGlhdGVkX2dlbm90eXBlJGdlbmU8LXJvd25hbWVzKERFX1A0X2NpbGlhdGVkX2dlbm90eXBlKQojREVfUDRfc2VjcmV0b3J5X2dlbm90eXBlJHNpZzwtREVfUDRfc2VjcmV0b3J5X2dlbm90eXBlJHBfdmFsX2FkajwwLjAwMQpERV9QNF9jaWxpYXRlZF9nZW5vdHlwZSR0aHJlc2hvbGQ8LSBpZmVsc2UoREVfUDRfY2lsaWF0ZWRfZ2Vub3R5cGUkYXZnX2xvZ0ZDPjAgJiBERV9QNF9jaWxpYXRlZF9nZW5vdHlwZSRwX3ZhbF9hZGo8MC4wMDEsICJ3dF9lbnJpY2giLGlmZWxzZShERV9QNF9jaWxpYXRlZF9nZW5vdHlwZSRhdmdfbG9nRkM8MCAmIERFX1A0X2NpbGlhdGVkX2dlbm90eXBlJHBfdmFsX2FkajwwLjAwMSwgIm11dF9lbnJpY2giLCJOb3RTaWduaWZpY2FudCIgKSApCmdncGxvdChERV9QNF9jaWxpYXRlZF9nZW5vdHlwZSwgYWVzKGF2Z19sb2dGQywgLWxvZzEwKHBfdmFsX2FkaikpKSArICN2b2xjYW5vcGxvdCB3aXRoIGF2Z19sb2dGQyB2ZXJzdXMgcF92YWxfYWRqCiAgICBnZW9tX3BvaW50KGFlcyhjb2w9dGhyZXNob2xkKSxzaXplPTAuMikgKyAjYWRkIHBvaW50cyBjb2xvcmVkIGJ5IHNpZ25pZmljYW5jZQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9YygiZ3JlZW4iLCAiYmxhY2siLCJtYWdlbnRhIikpKwogICAgZ2d0aXRsZSgiUDRDaWxpYXRlZF93dC9tdXQiKSArIGdlb21fdGV4dF9yZXBlbChkYXRhPURFX1A0X2NpbGlhdGVkX2dlbm90eXBlW0RFX1A0X2NpbGlhdGVkX2dlbm90eXBlJGdlbmUgJWluJSBnZW5lTGlzdCRQcmltYXJ5LmNpbGlhcnkuZHlza2luZXNpYSxdLCBhZXMobGFiZWw9Z2VuZSksIHBvaW50LnBhZGRpbmcgPSAxLCBib3gucGFkZGluZyA9IC4zKSArCiAgbGFicyh5ID0gZXhwcmVzc2lvbigtbG9nWzEwXSoiICIqImFkanVzdGVkIHB2YWx1ZSIpLCB4ID0gImF2ZyBsb2cgZm9sZCBjaGFuZ2UiKSArIAogIHRoZW1lKGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSwgbGVnZW5kLnBvc2l0aW9uID0gInRvcCIpIApgYGAKYGBge3J9CgpERV9QNF9jaWxpYXRlZF9nZW5vdHlwZVtERV9QNF9jaWxpYXRlZF9nZW5vdHlwZSRnZW5lICVpbiUgZ2VuZUxpc3QkUHJpbWFyeS5jaWxpYXJ5LmR5c2tpbmVzaWEsXQpgYGAKCmBgYHtyfQoKREVfUDRfY2lsaWF0ZWRfZ2Vub3R5cGVbREVfUDRfY2lsaWF0ZWRfZ2Vub3R5cGUkZ2VuZSAlaW4lIGdlbmVMaXN0JENpbGlvcGF0aHksXQpgYGAKCmBgYHtyfQpERV9QNF9iYXNhbF9nZW5vdHlwZTwtRmluZE1hcmtlcnMoUDRfT2N0MThfZXBpLGNlbGxzLjE8LVdoaWNoQ2VsbHMob2JqZWN0PVA0X09jdDE4X2VwaSxjZWxscy51c2UgPSAoUDRfT2N0MThfZXBpQG1ldGEuZGF0YSRnZW5vdHlwZT09Ind0IiAmIFA0X09jdDE4X2VwaUBtZXRhLmRhdGEkY2VsbF90eXBlPT0iQmFzYWwiICkpLGNlbGxzLjI8LVdoaWNoQ2VsbHMob2JqZWN0PVA0X09jdDE4X2VwaSxjZWxscy51c2UgPSAoUDRfT2N0MThfZXBpQG1ldGEuZGF0YSRnZW5vdHlwZT09Im11dCIgJiBQNF9PY3QxOF9lcGlAbWV0YS5kYXRhJGNlbGxfdHlwZT09IkJhc2FsIiApKSxvbmx5LnBvcyA9IEYsbG9nZmMudGhyZXNob2xkPTAsbWluLnBjdD0wLjA1KQpERV9QNF9iYXNhbF9nZW5vdHlwZQpgYGAKYGBge3J9CndyaXRlLnRhYmxlKERFX1A0X2Jhc2FsX2dlbm90eXBlLCJERV9QNF9iYXNhbF9nZW5vdHlwZS50eHQiLHNlcD0iXHQiKQpgYGAKCmBgYHtyfQpQNF9iYXNhbF9hdXRvbWF0aWNfZ2VuZUxpc3Q8LURFX1A0X2Jhc2FsX2dlbm90eXBlJGdlbmVbREVfUDRfYmFzYWxfZ2Vub3R5cGUkcF92YWxfYWRqPDAuMDAxICYgYWJzKERFX1A0X2Jhc2FsX2dlbm90eXBlJGF2Z19sb2dGQyk+MC41ICYgYWJzKERFX1A0X2Jhc2FsX2dlbm90eXBlJHBjdC4xLURFX1A0X2Jhc2FsX2dlbm90eXBlJHBjdC4yKT4wLjE1XQpgYGAKYGBge3J9CmxpYnJhcnkoZ2dyZXBlbCkKYGBgCmBgYHtyLGZpZy5oZWlnaHQ9OCxmaWcud2lkdGg9MTJ9CkRFX1A0X2Jhc2FsX2dlbm90eXBlJGdlbmU8LXJvd25hbWVzKERFX1A0X2Jhc2FsX2dlbm90eXBlKQojREVfUDRfc2VjcmV0b3J5X2dlbm90eXBlJHNpZzwtREVfUDRfc2VjcmV0b3J5X2dlbm90eXBlJHBfdmFsX2FkajwwLjAwMQpERV9QNF9iYXNhbF9nZW5vdHlwZSR0aHJlc2hvbGQ8LSBpZmVsc2UoREVfUDRfYmFzYWxfZ2Vub3R5cGUkYXZnX2xvZ0ZDPjAgJiBERV9QNF9iYXNhbF9nZW5vdHlwZSRwX3ZhbF9hZGo8MC4wMDEsICJ3dF9lbnJpY2giLGlmZWxzZShERV9QNF9iYXNhbF9nZW5vdHlwZSRhdmdfbG9nRkM8MCAmIERFX1A0X2Jhc2FsX2dlbm90eXBlJHBfdmFsX2FkajwwLjAwMSwgIm11dF9lbnJpY2giLCJOb3RTaWduaWZpY2FudCIgKSApCmdncGxvdChERV9QNF9iYXNhbF9nZW5vdHlwZSwgYWVzKGF2Z19sb2dGQywgLWxvZzEwKHBfdmFsX2FkaikpKSArICN2b2xjYW5vcGxvdCB3aXRoIGF2Z19sb2dGQyB2ZXJzdXMgcF92YWxfYWRqCiAgICBnZW9tX3BvaW50KGFlcyhjb2w9dGhyZXNob2xkKSxzaXplPTAuMikgKyAjYWRkIHBvaW50cyBjb2xvcmVkIGJ5IHNpZ25pZmljYW5jZQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9YygiZ3JlZW4iLCAiYmxhY2siLCJtYWdlbnRhIikpKwogICAgZ2d0aXRsZSgiUDRCYXNhbF93dC9tdXQiKSArIGdlb21fdGV4dF9yZXBlbChkYXRhPURFX1A0X2Jhc2FsX2dlbm90eXBlW0RFX1A0X2Jhc2FsX2dlbm90eXBlJGdlbmUgJWluJSBQNF9iYXNhbF9hdXRvbWF0aWNfZ2VuZUxpc3QsXSwgYWVzKGxhYmVsPWdlbmUpLCBwb2ludC5wYWRkaW5nID0gMSwgYm94LnBhZGRpbmcgPSAuMykgKwogIGxhYnMoeSA9IGV4cHJlc3Npb24oLWxvZ1sxMF0qIiAiKiJhZGp1c3RlZCBwdmFsdWUiKSwgeCA9ICJhdmcgbG9nIGZvbGQgY2hhbmdlIikgKyAKICB0aGVtZShsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCksIGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiKSAKYGBgCgpgYGB7cn0KREVfUDRfc2VjcmV0b3J5X2dlbm90eXBlPC1GaW5kTWFya2VycyhQNF9PY3QxOF9lcGksY2VsbHMuMTwtV2hpY2hDZWxscyhvYmplY3Q9UDRfT2N0MThfZXBpLGNlbGxzLnVzZSA9IChQNF9PY3QxOF9lcGlAbWV0YS5kYXRhJGdlbm90eXBlPT0id3QiICYgUDRfT2N0MThfZXBpQG1ldGEuZGF0YSRjZWxsX3R5cGU9PSJTZWNyZXRvcnkiICkpLGNlbGxzLjI8LVdoaWNoQ2VsbHMob2JqZWN0PVA0X09jdDE4X2VwaSxjZWxscy51c2UgPSAoUDRfT2N0MThfZXBpQG1ldGEuZGF0YSRnZW5vdHlwZT09Im11dCIgJiBQNF9PY3QxOF9lcGlAbWV0YS5kYXRhJGNlbGxfdHlwZT09IlNlY3JldG9yeSIgKSksb25seS5wb3MgPSBGLGxvZ2ZjLnRocmVzaG9sZD0wLG1pbi5wY3Q9MC4wNSkKREVfUDRfc2VjcmV0b3J5X2dlbm90eXBlCmBgYApgYGB7cn0Kd3JpdGUudGFibGUoREVfUDRfc2VjcmV0b3J5X2dlbm90eXBlLCJERV9QNF9zZWNyZXRvcnlfZ2Vub3R5cGUudHh0IixzZXA9Ilx0IikKYGBgCgoKYGBge3J9ClA0X3NlY19hdXRvbWF0aWNfZ2VuZUxpc3Q8LURFX1A0X3NlY3JldG9yeV9nZW5vdHlwZSRnZW5lW0RFX1A0X3NlY3JldG9yeV9nZW5vdHlwZSRwX3ZhbF9hZGo8MC4wMDEgJiBhYnMoREVfUDRfc2VjcmV0b3J5X2dlbm90eXBlJGF2Z19sb2dGQyk+MC41ICYgYWJzKERFX1A0X3NlY3JldG9yeV9nZW5vdHlwZSRwY3QuMS1ERV9QNF9zZWNyZXRvcnlfZ2Vub3R5cGUkcGN0LjIpPjAuMTVdCmBgYApgYGB7cn0KbGlicmFyeShnZ3JlcGVsKQpgYGAKYGBge3J9CkRFX1A0X3NlY3JldG9yeV9nZW5vdHlwZSRnZW5lPC1yb3duYW1lcyhERV9QNF9zZWNyZXRvcnlfZ2Vub3R5cGUpCkRFX1A0X3NlY3JldG9yeV9nZW5vdHlwZSRzaWc8LURFX1A0X3NlY3JldG9yeV9nZW5vdHlwZSRwX3ZhbF9hZGo8MC4wMDEKREVfUDRfc2VjcmV0b3J5X2dlbm90eXBlJHRocmVzaG9sZDwtIGlmZWxzZShERV9QNF9zZWNyZXRvcnlfZ2Vub3R5cGUkYXZnX2xvZ0ZDPjAgJiBERV9QNF9zZWNyZXRvcnlfZ2Vub3R5cGUkcF92YWxfYWRqPDAuMDAxLCAid3RfZW5yaWNoIixpZmVsc2UoREVfUDRfc2VjcmV0b3J5X2dlbm90eXBlJGF2Z19sb2dGQzwwICYgREVfUDRfc2VjcmV0b3J5X2dlbm90eXBlJHBfdmFsX2FkajwwLjAwMSwgIm11dF9lbnJpY2giLCJOb3RTaWduaWZpY2FudCIgKSApCnZvbGMgPSBnZ3Bsb3QoREVfUDRfc2VjcmV0b3J5X2dlbm90eXBlLCBhZXMoYXZnX2xvZ0ZDLCAtbG9nMTAocF92YWxfYWRqKSkpICsgI3ZvbGNhbm9wbG90IHdpdGggYXZnX2xvZ0ZDIHZlcnN1cyBwX3ZhbF9hZGoKICAgIGdlb21fcG9pbnQoYWVzKGNvbD10aHJlc2hvbGQpLHNpemU9MC4yKSArICNhZGQgcG9pbnRzIGNvbG9yZWQgYnkgc2lnbmlmaWNhbmNlCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jKCJncmVlbiIsICJibGFjayIsIm1hZ2VudGEiKSkrCiAgICBnZ3RpdGxlKCJQNHNlY3JldG9yeV93dC9tdXQiKSArIGdlb21fdGV4dF9yZXBlbChkYXRhPURFX1A0X3NlY3JldG9yeV9nZW5vdHlwZVtERV9QNF9zZWNyZXRvcnlfZ2Vub3R5cGUkZ2VuZSAlaW4lIFA0X3NlY19hdXRvbWF0aWNfZ2VuZUxpc3QsXSwgYWVzKGxhYmVsPWdlbmUpLCBwb2ludC5wYWRkaW5nID0gMSwgYm94LnBhZGRpbmcgPSAuMykgKwogIGxhYnMoeSA9IGV4cHJlc3Npb24oLWxvZ1sxMF0qIiAiKiJhZGp1c3RlZCBwdmFsdWUiKSwgeCA9ICJhdmcgbG9nIGZvbGQgY2hhbmdlIikgKyAKICB0aGVtZShsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCksIGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiKSAKYGBgCmBgYHtyLGZpZy5oZWlnaHQ9OCxmaWcud2lkdGg9MTJ9CnZvbGMKYGBgCgpgYGB7cn0KUDRfc2VjX2dlbmVMaXN0PC1jKCJJdGxuMSIsIlJldG5sYSIsIkNoaWw0IiwiQ2xjYTEiLCJDeGNsMTUiLCJGY2dicCIsIk5ma2JpYSIsIkhzcGE1IiwiTHk2ayIsIklmcmQxIiwiR200MjQxOCIsIkN4Y2wyIiwiTmZrYml6IiwiTGNuMiIsIklnZmJwMyIsIkNyaXAxIiwiU2VsZW5icDEiLCJUcHBwMyIsIkx5ejIiLCJTMTAwYTYiLCJQbGFjOCIsIkFVMDQwOTcyIiwiS2xrMTAiLCJMeXoxIiwiTHk2YSIsIkxnYWxzMyIsIkN4Y2wxNyIsIkYzIiwiS3J0NyIsIkNwIiwiVHNjMjJkMyIsIk10MSIsIkNoaWwxIiwiS3J0NCIsIlB0cHJ6MSIsIklmaXRtMSIsIlR4bmlwIiwiUzEwMGExMCIsIkx5Nmc2YyIsIkhlczEiLCJDbGRuMyIsIktsazExIiwiU2xwaSIsIkJhaWFwMiIsIlBsZXQxIiwiU2NubjFhIiwiTGJwIiwiTHRmIiwiUHRnZXMiLCJNdWM0IiwiQXRwMWIxIiwiQXRwN2IiLCJQdHA0YTEiLCJBQTQ2NzE5NyIpCmBgYAoKYGBge3IsZmlnLmhlaWdodD04LGZpZy53aWR0aD0xNn0KI0RFX1A0X3NlY3JldG9yeV9nZW5vdHlwZSRnZW5lPC1yb3duYW1lcyhERV9QNF9zZWNyZXRvcnlfZ2Vub3R5cGUpCiNERV9QNF9zZWNyZXRvcnlfZ2Vub3R5cGUkc2lnPC1ERV9QNF9zZWNyZXRvcnlfZ2Vub3R5cGUkcF92YWxfYWRqPDAuMDAxCiNERV9QNF9zZWNyZXRvcnlfZ2Vub3R5cGUkdGhyZXNob2xkPC0gaWZlbHNlKERFX1A0X3NlY3JldG9yeV9nZW5vdHlwZSRhdmdfbG9nRkM+MCAmIERFX1A0X3NlY3JldG9yeV9nZW5vdHlwZSRwX3ZhbF9hZGo8MC4wMDEsICJ3dF9lbnJpY2giLGlmZWxzZShERV9QNF9zZWNyZXRvcnlfZ2Vub3R5cGUkYXZnX2xvZ0ZDPDAgJiBERV9QNF9zZWNyZXRvcnlfZ2Vub3R5cGUkcF92YWxfYWRqPDAuMDAxLCAibXV0X2VucmljaCIsIk5vdFNpZ25pZmljYW50IiApICkKZ2dwbG90KERFX1A0X3NlY3JldG9yeV9nZW5vdHlwZSwgYWVzKGF2Z19sb2dGQywgLWxvZzEwKHBfdmFsX2FkaikpKSArICN2b2xjYW5vcGxvdCB3aXRoIGF2Z19sb2dGQyB2ZXJzdXMgcF92YWxfYWRqCiAgICBnZW9tX3BvaW50KGFlcyhjb2w9dGhyZXNob2xkKSxzaXplPTAuNCkgKyAjYWRkIHBvaW50cyBjb2xvcmVkIGJ5IHNpZ25pZmljYW5jZQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9YygiZ3JlZW4iLCAiYmxhY2siLCJtYWdlbnRhIikpKwogICAgZ2d0aXRsZSgiUDRzZWNyZXRvcnlfd3QvbXV0IikgKyBnZW9tX3RleHRfcmVwZWwoZGF0YT1ERV9QNF9zZWNyZXRvcnlfZ2Vub3R5cGVbREVfUDRfc2VjcmV0b3J5X2dlbm90eXBlJGdlbmUgJWluJSBQNF9zZWNfZ2VuZUxpc3QsXSwgYWVzKGxhYmVsPWdlbmUpLCBwb2ludC5wYWRkaW5nID0gMC4wMSwgYm94LnBhZGRpbmcgPSAwLjA1LHNpemU9OCxtYXguaXRlciA9IDYwMDApICsKICBsYWJzKHkgPSBleHByZXNzaW9uKC1sb2dbMTBdKiIgIioiYWRqdXN0ZWQgcHZhbHVlIiksIHggPSAiYXZnIGxvZyBmb2xkIGNoYW5nZSIpICsgCiAgdGhlbWUobGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpLCBsZWdlbmQucG9zaXRpb24gPSAidG9wIikgCmBgYAoKIyMjIyMgSW50ZXJsZXVraW5zOiAKYGBge3IsZmlnLmhlaWdodD0xNiwgZmlnLndpZHRoPTE1fQpWbG5QbG90KG9iamVjdCA9IFA0X09jdDE4X2VwaSwgZmVhdHVyZXMucGxvdCA9IGMoIklsMTAiLCJJbDExIiwiSWwxMmEiLCJJbDEzIiwiSWwxNSIsIklsMTYiLCJJbDE3YSIsIklsMTdiIiwiSWwxN2MiLCJJbDE3ZCIsIklsMTdmIiwiSWwxOCIsIklsMiIsIklsMjEiLCJJbDIyIiwiSWwyNCIsIklsMjUiLCJJbDI3IiwiSWwzMyIsIklsMzQiLCJJbDQiLCJJbDUiLCJJbDYiLCJJbDciLCJJbDFhIiwiSWwxYiIsIklsMzEiKSwgbkNvbCA9IDYseC5sYWIucm90ID0gVCxwb2ludC5zaXplLnVzZSA9IDAuMixncm91cC5ieT0iY2VsbF90eXBlIiwgbGVnZW5kLnBvc2l0aW9uID0gImxlZnQiKQpgYGAKCiMjIyMjIEludGVyZmVyb25zOiB2ZXJ5IGZldyBhcmUgZXhwcmVzc2VkCgpgYGB7cixmaWcuaGVpZ2h0PTE2LCBmaWcud2lkdGg9MTV9ClZsblBsb3Qob2JqZWN0ID0gUDRfT2N0MThfZXBpLCBmZWF0dXJlcy5wbG90ID0gZ3JlcCgiSWZuIixyb3duYW1lcyhQNF9PY3QxOF9lcGlAZGF0YSksdmFsdWU9VCksIG5Db2wgPSAzLHgubGFiLnJvdCA9IFQscG9pbnQuc2l6ZS51c2UgPSAwLjIsZ3JvdXAuYnk9ImNlbGxfdHlwZSIsIGxlZ2VuZC5wb3NpdGlvbiA9ICJsZWZ0IikKYGBgCgojIyMjIyBhbnRpbWljcm9iaWFsIGVmZmVjdG9yczogd3QgdnMgbXV0CgpgYGB7cixmaWcuaGVpZ2h0PTQsZmlnLndpZHRoPTZ9ClNwbGl0RG90UGxvdEdHKG9iamVjdCA9IFA0X09jdDE4X2VwaSwgY29scy51c2UgPSBjKCJmb3Jlc3RncmVlbiIsImZvcmVzdGdyZWVuIiksZ2VuZXMucGxvdCA9IGMoIk11YzEiLCJNdWM0IiwiTXVjMTYiLCJNdWMyMCIsIk11YzViIiwiTXVjNWFjIiwiTXVjMiIsIkRlZmIxIiwiTHl6MiIsIkx0ZiIsIlNmdHBhMSIsIlNmdHBkIiwiU2Z0cGIiLCJTbHBpIiwiTGNuMiIsIlBpZ3IiLCJDaGlsNCIpLGdyb3VwLmJ5PSJjZWxsX3R5cGUiLGdyb3VwaW5nLnZhcj0iZ2Vub3R5cGUiLHgubGFiLnJvdCA9IFQscGxvdC5sZWdlbmQgPSBUKSAjdGhpcyBzY2FsZXMgZ2Vub3R5cGVzIHNlcGFyYXRlbHkKYGBgCmBgYHtyfQpQNF9PY3QxOF9lcGlAbWV0YS5kYXRhJHR5cGVfZ2Vub3R5cGU8LWFzLmZhY3RvcihwYXN0ZShQNF9PY3QxOF9lcGlAbWV0YS5kYXRhJGNlbGxfdHlwZSxQNF9PY3QxOF9lcGlAbWV0YS5kYXRhJGdlbm90eXBlLHNlcD0iXyIpKQpgYGAKCgpgYGB7cixmaWcuaGVpZ2h0PTYsZmlnLndpZHRoPTV9ClA0X09jdDE4X2VwaTwtU2V0QWxsSWRlbnQob2JqZWN0ID0gUDRfT2N0MThfZXBpLCBpZCA9ICJ0eXBlX2dlbm90eXBlIikKClA0X09jdDE4X2VwaUBpZGVudD1mYWN0b3IoUDRfT2N0MThfZXBpQGlkZW50LGxldmVscyhQNF9PY3QxOF9lcGlAaWRlbnQpW2MoMSwyLDcsOCw1LDYsMyw0KV0pCkRvdFBsb3Qob2JqZWN0ID0gUDRfT2N0MThfZXBpLCBjb2xzLnVzZSA9IGMoInllbGxvdyIsInJlZCIpLGdlbmVzLnBsb3QgPSByZXYoYygiU2Z0cGExIiwiQ2hpbDQiLCJNdWM1YWMiLCJNdWMyIiwiTXVjMjAiLCJNdWM1YiIsIk11YzEiLCJNdWMxNiIsIk11YzQiLCJQaWdyIiwiTHRmIiwiTHl6MiIsIlNscGkiLCJMY24yIiwiU2Z0cGQiLCJTZnRwYiIsIkRlZmIxIikpLHgubGFiLnJvdCA9IFQscGxvdC5sZWdlbmQgPSBULGdyb3VwLmJ5ID0gImlkZW50Iixkby5yZXR1cm49VCkrcm90YXRlKCkrIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIHZqdXN0ID0gMSxoanVzdD0xKSkgI3RoaXMgc2NhbGVzIGJvdGggZ2Vub3R5cGVzIHRvZ2V0aGVyCmBgYAoKYGBge3IsZmlnLmhlaWdodD02LGZpZy53aWR0aD01fQpQNF9PY3QxOF9lcGk8LVNldEFsbElkZW50KG9iamVjdCA9IFA0X09jdDE4X2VwaSwgaWQgPSAidHlwZV9nZW5vdHlwZSIpCgpQNF9PY3QxOF9lcGlAaWRlbnQ9ZmFjdG9yKFA0X09jdDE4X2VwaUBpZGVudCxsZXZlbHMoUDRfT2N0MThfZXBpQGlkZW50KVtjKDEsMiw3LDgsNSw2LDMsNCldKQpEb3RQbG90KG9iamVjdCA9IFA0X09jdDE4X2VwaSwgY29scy51c2UgPSBjKCJ5ZWxsb3ciLCJyZWQiKSxnZW5lcy5wbG90ID0gcmV2KGMoIk5ma2JpYSIsIk5ma2JpeiIsIlJldG5sYSIsIkN4Y2wxNyIsIkN4Y2wxNSIsIkNjbDIwIiwiQXJlZyIsIkNoaWw0IiwiTXVjNWIiLCJNdWM0IiwiUGlnciIsIkx0ZiIsIkx5ejIiLCJTbHBpIiwiTGNuMiIsIlNmdHBkIiwiU2Z0cGIiLCJEZWZiMSIsIkxnYWxzMyIsIkl0bG4xIikpLHgubGFiLnJvdCA9IFQscGxvdC5sZWdlbmQgPSBULGdyb3VwLmJ5ID0gImlkZW50Iixkby5yZXR1cm49VCkrcm90YXRlKCkrIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIHZqdXN0ID0gMSxoanVzdD0xKSkgI3RoaXMgc2NhbGVzIGJvdGggZ2Vub3R5cGVzIHRvZ2V0aGVyCmBgYAoKYGBge3J9CmRmX1A0X2VwaTwtRmV0Y2hEYXRhKFA0X09jdDE4X2VwaSxjKCJTcGRlZiIsIkNyZWIzbDEiLCJTY2diM2EyIiwiU2NnYjFhMSIsIktydDQiLCJLcnQxMyIsIkZveGEzIiwiQXFwMyIsIkFxcDQiLCJBcXA1IiwiR3AyIiwiU29zdGRjMSIsIlNtb2MyIiwiS3J0MTQiLCJLcnQxNSIsIktydDUiLCJSYWMyIiwiQ2xpYzMiLCJyZXMuMC44IiwiZ2Vub3R5cGUiLCJzZXFfZ3JvdXAiLCJzcGVjaWZpY190eXBlIiwiY2VsbF90eXBlIiwiRGVmYjEiLCJMeXoyIiwiTHRmIiwiU2Z0cGExIiwiU2Z0cGQiLCJTZnRwYiIsIlNscGkiLCJMY24yIiwiUGlnciIsIk11YzViIiwiTXVjNWFjIiwiQ2hpbDQiLCJNdWMxIiwiTXVjMiIsIk11YzQiLCJNdWMxNiIsIk11YzIwIiwiTGJwIiwiQ2QxNCIsIlRscjQiLCJUbHIyIiwiTXlkODgiLCJUaWNhbTEiLCJJdGxuMSIsIkxnYWxzMyIsIlJlZzNnIiwiTm9kMSIsIk5vZDIiLCJEZHg1OCIsIklmaWgxIiwiRGh4NTgiLCJDY2w1IiwiQ3hjbDEwIiwiQ3hjbDIiLCJDeGNsMSIsIlBmNCIsIkN4Y2wxMiIsIkN4Y2wxNCIsIkN4Y2wxNSIsIkN4Y2wxNiIsIkN4Y2wxNyIsIkNjbDIiLCJDY2w3IiwiQ2NsMTciLCJDY2wyMCIsIkNjbDIxYSIsIkNjbDI1IiwiQ2NsMjdhIiwiQ2NsMjgiLCJDeDNjbDEiLCJJbDEwIiwiVG5mIiwiUzEwMGE4IiwiUzEwMGE5IiwiSWw2IiwiSWwxOCIsIklsMWIiLCJJbDFybDEiLCJDY2wxMSIsIkNjbDI0IiwiSWwzMyIsIklsMjUiLCJUc2xwIiwiRjJybDEiLCJSZXRubGEiLCJBbG94MTUiLCJBbG94NSIsIkdhdGEyIiwiVGdmYjIiLCJUZ2ZiMSIsIk9ybWRsMyIsIlB0Z2VzIiwiUHRnZHMiLCJQdGdzMiIsIkhwZ2RzIiwiVGJ4YXMxIiwiQXJlZyIsIklsMiIsIklsMzQiLCJJbDE1IiwiSWZubHIxIiwiTmZrYml6IiwiTmZrYmlhIikpCgpgYGAKIyMjIyMgTWljcm9iaWFsU2Vuc2luZzoKYGBge3IsIGZpZy5oZWlnaHQ9MywgZmlnLndpZHRoPTd9CmZvciAoaSBpbiBjKCJMYnAiLCJDZDE0IiwiVGxyNCIsIlRscjIiLCJNeWQ4OCIsIlRpY2FtMSIsIkl0bG4xIiwiUmVnM2ciLCJMZ2FsczMiLCJOb2QxIiwiTm9kMiIsIkRkeDU4IiwiSWZpaDEiLCJEaHg1OCIpKQp7CnBkZihmaWxlID0gcGFzdGUoIk1hbnVzY3JpcHQvTWljcm9iaWFsU2Vuc2luZ19nZW5vdHlwZS9QNC8iLGksIi5wZGYiLCBzZXAgPSAiIiksIHdpZHRoID0gNiwgaGVpZ2h0ID0gNSkKcHJpbnQoZ2dwbG90KGRmX1A0X2VwaSxhZXNfc3RyaW5nKHg9Imdlbm90eXBlIix5PWkpKStmYWNldF9ncmlkKC5+Y2VsbF90eXBlKStnZW9tX2RvdHBsb3QoYmluYXhpcz0ieSIsYWVzKGZpbGw9Z2Vub3R5cGUpLGJpbndpZHRoPTAuMDUsc3RhY2tkaXI9ImNlbnRlciIscG9zaXRpb249cG9zaXRpb25fZG9kZ2UoMC44KSwgZG90c2l6ZT0wLjIpK3N0YXRfY29tcGFyZV9tZWFucyhjb21wYXJpc29ucyA9IGxpc3QoYygid3QiLCAibXV0IikpLG1ldGhvZD0id2lsY294LnRlc3QiLHNpemU9NCxsYWJlbD0icC5hZGoiKSsgc3RhdF9zdW1tYXJ5KGFlcyhjb2xvcj1nZW5vdHlwZSksZnVuLmRhdGE9bWVhbl9zZGwsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCAKICAgICAgICAgICAgICAgICBnZW9tPSJwb2ludHJhbmdlIixwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgwLjcpKSsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSxoanVzdD0xKSxzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDksIGNvbG91ciA9ICJibGFjayIsIGFuZ2xlID0gMCkpKQpkZXYub2ZmKCkKfQpgYGAKCiMjIyMjIGFudGltaWNyb2JpYWwgZWZmZWN0b3JzOgpgYGB7ciwgZmlnLmhlaWdodD0zLCBmaWcud2lkdGg9N30KZm9yIChpIGluIGMoIk11YzEiLCJNdWM0IiwiTXVjMTYiLCJNdWMyMCIsIk11YzViIiwiTXVjNWFjIiwiTXVjMiIsIkRlZmIxIiwiTHl6MiIsIkx0ZiIsIlNmdHBhMSIsIlNmdHBkIiwiU2Z0cGIiLCJTbHBpIiwiTGNuMiIsIlBpZ3IiLCJDaGlsNCIpKQp7CnBkZihmaWxlID0gcGFzdGUoIk1hbnVzY3JpcHQvRWZmZWN0b3JzX2dlbm90eXBlL1A0LyIsaSwiLnBkZiIsIHNlcCA9ICIiKSwgd2lkdGggPSA2LCBoZWlnaHQgPSA1KQpwcmludChnZ3Bsb3QoZGZfUDRfZXBpLGFlc19zdHJpbmcoeD0iZ2Vub3R5cGUiLHk9aSkpK2ZhY2V0X2dyaWQoLn5jZWxsX3R5cGUpK2dlb21fZG90cGxvdChiaW5heGlzPSJ5IixhZXMoZmlsbD1nZW5vdHlwZSksYmlud2lkdGg9MC4wNSxzdGFja2Rpcj0iY2VudGVyIixwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgwLjgpLCBkb3RzaXplPTAuMikrc3RhdF9jb21wYXJlX21lYW5zKGNvbXBhcmlzb25zID0gbGlzdChjKCJ3dCIsICJtdXQiKSksbWV0aG9kPSJ3aWxjb3gudGVzdCIsc2l6ZT00LGxhYmVsPSJwLmFkaiIpKyBzdGF0X3N1bW1hcnkoYWVzKGNvbG9yPWdlbm90eXBlKSxmdW4uZGF0YT1tZWFuX3NkbCwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIAogICAgICAgICAgICAgICAgIGdlb209InBvaW50cmFuZ2UiLHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKDAuNykpKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LGhqdXN0PTEpLHN0cmlwLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gOSwgY29sb3VyID0gImJsYWNrIiwgYW5nbGUgPSAwKSkpCmRldi5vZmYoKQp9CmBgYAojIyMjIyBjaGVtb2tpbmVzOgpgYGB7ciwgZmlnLmhlaWdodD0zLCBmaWcud2lkdGg9N30KZm9yIChpIGluIGMoIkNjbDUiLCJDeGNsMTAiLCJDeGNsMiIsIkN4Y2wxIiwiUGY0IiwiQ3hjbDEyIiwiQ3hjbDE0IiwiQ3hjbDE1IiwiQ3hjbDE2IiwiQ3hjbDE3IiwiQ2NsMiIsIkNjbDciLCJDY2wxNyIsIkNjbDIwIiwiQ2NsMjFhIiwiQ2NsMjUiLCJDY2wyN2EiLCJDY2wyOCIsIkN4M2NsMSIpKQp7CnBkZihmaWxlID0gcGFzdGUoIk1hbnVzY3JpcHQvY2hlbW9raW5lc19nZW5vdHlwZS9QNC8iLGksIi5wZGYiLCBzZXAgPSAiIiksIHdpZHRoID0gNiwgaGVpZ2h0ID0gNSkKcHJpbnQoZ2dwbG90KGRmX1A0X2VwaSxhZXNfc3RyaW5nKHg9Imdlbm90eXBlIix5PWkpKStmYWNldF9ncmlkKC5+Y2VsbF90eXBlKStnZW9tX2RvdHBsb3QoYmluYXhpcz0ieSIsYWVzKGZpbGw9Z2Vub3R5cGUpLGJpbndpZHRoPTAuMDUsc3RhY2tkaXI9ImNlbnRlciIscG9zaXRpb249cG9zaXRpb25fZG9kZ2UoMC44KSwgZG90c2l6ZT0wLjIpK3N0YXRfY29tcGFyZV9tZWFucyhjb21wYXJpc29ucyA9IGxpc3QoYygid3QiLCAibXV0IikpLG1ldGhvZD0id2lsY294LnRlc3QiLHNpemU9NCxsYWJlbD0icC5hZGoiKSsgc3RhdF9zdW1tYXJ5KGFlcyhjb2xvcj1nZW5vdHlwZSksZnVuLmRhdGE9bWVhbl9zZGwsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCAKICAgICAgICAgICAgICAgICBnZW9tPSJwb2ludHJhbmdlIixwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgwLjcpKSsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSxoanVzdD0xKSxzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDksIGNvbG91ciA9ICJibGFjayIsIGFuZ2xlID0gMCkpKQpkZXYub2ZmKCkKfQpgYGAKIyMjIyMgVGgyOgpgYGB7ciwgZmlnLmhlaWdodD0zLCBmaWcud2lkdGg9N30KZm9yIChpIGluIGMoIklsMTAiLCJUbmYiLCJTMTAwYTgiLCJTMTAwYTkiLCJJbDYiLCJJbDE4IiwiSWwxYiIsIklsMXJsMSIsIkNjbDExIiwiQ2NsMjQiLCJJbDMzIiwiSWwyNSIsIlRzbHAiLCJGMnJsMSIsIlJldG5sYSIsIkFsb3gxNSIsIkFsb3g1IiwiR2F0YTIiLCJUZ2ZiMiIsIlRnZmIxIiwiT3JtZGwzIiwiUHRnZXMiLCJQdGdkcyIsIlB0Z3MyIiwiSHBnZHMiLCJUYnhhczEiLCJBcmVnIikpCnsKcGRmKGZpbGUgPSBwYXN0ZSgiTWFudXNjcmlwdC9UaDJfZ2Vub3R5cGUvUDQvIixpLCIucGRmIiwgc2VwID0gIiIpLCB3aWR0aCA9IDYsIGhlaWdodCA9IDUpCnByaW50KGdncGxvdChkZl9QNF9lcGksYWVzX3N0cmluZyh4PSJnZW5vdHlwZSIseT1pKSkrZmFjZXRfZ3JpZCgufmNlbGxfdHlwZSkrZ2VvbV9kb3RwbG90KGJpbmF4aXM9InkiLGFlcyhmaWxsPWdlbm90eXBlKSxiaW53aWR0aD0wLjA1LHN0YWNrZGlyPSJjZW50ZXIiLHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKDAuOCksIGRvdHNpemU9MC4yKStzdGF0X2NvbXBhcmVfbWVhbnMoY29tcGFyaXNvbnMgPSBsaXN0KGMoInd0IiwgIm11dCIpKSxtZXRob2Q9IndpbGNveC50ZXN0IixzaXplPTQsbGFiZWw9InAuYWRqIikrIHN0YXRfc3VtbWFyeShhZXMoY29sb3I9Z2Vub3R5cGUpLGZ1bi5kYXRhPW1lYW5fc2RsLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgCiAgICAgICAgICAgICAgICAgZ2VvbT0icG9pbnRyYW5nZSIscG9zaXRpb249cG9zaXRpb25fZG9kZ2UoMC43KSkrIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsaGp1c3Q9MSksc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA5LCBjb2xvdXIgPSAiYmxhY2siLCBhbmdsZSA9IDApKSkKZGV2Lm9mZigpCn0KYGBgCmBgYHtyLCBmaWcuaGVpZ2h0PTUsIGZpZy53aWR0aD02fQoKZ2dwbG90KGRmX1A0X2VwaSxhZXMoZ2Vub3R5cGUsTmZrYmlhKSkrZmFjZXRfZ3JpZCgufmNlbGxfdHlwZSkrZ2VvbV9kb3RwbG90KGJpbmF4aXM9InkiLGFlcyhmaWxsPWdlbm90eXBlKSxiaW53aWR0aD0wLjA1LHN0YWNrZGlyPSJjZW50ZXIiLHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKDAuOCksIGRvdHNpemU9MC4yKStzdGF0X2NvbXBhcmVfbWVhbnMoY29tcGFyaXNvbnMgPSBsaXN0KGMoInd0IiwgIm11dCIpKSxtZXRob2Q9IndpbGNveC50ZXN0IixzaXplPTQsbGFiZWw9InAuYWRqIikrIHN0YXRfc3VtbWFyeShhZXMoY29sb3I9Z2Vub3R5cGUpLGZ1bi5kYXRhPW1lYW5fc2RsLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgCiAgICAgICAgICAgICAgICAgZ2VvbT0icG9pbnRyYW5nZSIscG9zaXRpb249cG9zaXRpb25fZG9kZ2UoMC43KSkrIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsaGp1c3Q9MSksc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA5LCBjb2xvdXIgPSAiYmxhY2siLCBhbmdsZSA9IDApKQpgYGAKCmBgYHtyLCBmaWcuaGVpZ2h0PTUsIGZpZy53aWR0aD02fQoKZ2dwbG90KGRmX1A0X2VwaSxhZXMoZ2Vub3R5cGUsSXRsbjEpKStmYWNldF9ncmlkKC5+Y2VsbF90eXBlKStnZW9tX2RvdHBsb3QoYmluYXhpcz0ieSIsYWVzKGZpbGw9Z2Vub3R5cGUpLGJpbndpZHRoPTAuMDUsc3RhY2tkaXI9ImNlbnRlciIscG9zaXRpb249cG9zaXRpb25fZG9kZ2UoMC44KSwgZG90c2l6ZT0wLjIpK3N0YXRfY29tcGFyZV9tZWFucyhjb21wYXJpc29ucyA9IGxpc3QoYygid3QiLCAibXV0IikpLG1ldGhvZD0id2lsY294LnRlc3QiLHNpemU9NCxsYWJlbD0icC5hZGoiKSsgc3RhdF9zdW1tYXJ5KGFlcyhjb2xvcj1nZW5vdHlwZSksZnVuLmRhdGE9bWVhbl9zZGwsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCAKICAgICAgICAgICAgICAgICBnZW9tPSJwb2ludHJhbmdlIixwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgwLjcpKSsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSxoanVzdD0xKSxzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDksIGNvbG91ciA9ICJibGFjayIsIGFuZ2xlID0gMCkpCmBgYAoKYGBge3IsIGZpZy5oZWlnaHQ9NSwgZmlnLndpZHRoPTZ9CgpnZ3Bsb3QoZGZfUDRfZXBpLGFlcyhnZW5vdHlwZSxSZWczZykpK2ZhY2V0X2dyaWQoLn5jZWxsX3R5cGUpK2dlb21fZG90cGxvdChiaW5heGlzPSJ5IixhZXMoZmlsbD1nZW5vdHlwZSksYmlud2lkdGg9MC4wNSxzdGFja2Rpcj0iY2VudGVyIixwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgwLjgpLCBkb3RzaXplPTAuMikrc3RhdF9jb21wYXJlX21lYW5zKGNvbXBhcmlzb25zID0gbGlzdChjKCJ3dCIsICJtdXQiKSksbWV0aG9kPSJ3aWxjb3gudGVzdCIsc2l6ZT00LGxhYmVsPSJwLmFkaiIpKyBzdGF0X3N1bW1hcnkoYWVzKGNvbG9yPWdlbm90eXBlKSxmdW4uZGF0YT1tZWFuX3NkbCwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIAogICAgICAgICAgICAgICAgIGdlb209InBvaW50cmFuZ2UiLHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKDAuNykpKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LGhqdXN0PTEpLHN0cmlwLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gOSwgY29sb3VyID0gImJsYWNrIiwgYW5nbGUgPSAwKSkKYGBgCmBgYHtyLCBmaWcuaGVpZ2h0PTUsIGZpZy53aWR0aD02fQoKZ2dwbG90KGRmX1A0X2VwaSxhZXMoZ2Vub3R5cGUsTGdhbHMzKSkrZmFjZXRfZ3JpZCgufmNlbGxfdHlwZSkrZ2VvbV9kb3RwbG90KGJpbmF4aXM9InkiLGFlcyhmaWxsPWdlbm90eXBlKSxiaW53aWR0aD0wLjA1LHN0YWNrZGlyPSJjZW50ZXIiLHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKDAuOCksIGRvdHNpemU9MC4yKStzdGF0X2NvbXBhcmVfbWVhbnMoY29tcGFyaXNvbnMgPSBsaXN0KGMoInd0IiwgIm11dCIpKSxtZXRob2Q9IndpbGNveC50ZXN0IixzaXplPTQsbGFiZWw9InAuYWRqIikrIHN0YXRfc3VtbWFyeShhZXMoY29sb3I9Z2Vub3R5cGUpLGZ1bi5kYXRhPW1lYW5fc2RsLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgCiAgICAgICAgICAgICAgICAgZ2VvbT0icG9pbnRyYW5nZSIscG9zaXRpb249cG9zaXRpb25fZG9kZ2UoMC43KSkrIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsaGp1c3Q9MSksc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA5LCBjb2xvdXIgPSAiYmxhY2siLCBhbmdsZSA9IDApKQpgYGAKCmBgYHtyLCBmaWcuaGVpZ2h0PTUsIGZpZy53aWR0aD0xMH0KCmdncGxvdChkZl9QNF9lcGksYWVzKGdlbm90eXBlLEFxcDMpKStmYWNldF9ncmlkKC5+Y2VsbF90eXBlKStnZW9tX2RvdHBsb3QoYmluYXhpcz0ieSIsYWVzKGZpbGw9Z2Vub3R5cGUpLGJpbndpZHRoPTAuMDUsc3RhY2tkaXI9ImNlbnRlciIscG9zaXRpb249cG9zaXRpb25fZG9kZ2UoMC44KSwgZG90c2l6ZT0wLjIpK3N0YXRfY29tcGFyZV9tZWFucyhjb21wYXJpc29ucyA9IGxpc3QoYygid3QiLCAibXV0IikpLG1ldGhvZD0id2lsY294LnRlc3QiLHNpemU9NCxsYWJlbD0icC5hZGoiKSsgc3RhdF9zdW1tYXJ5KGFlcyhjb2xvcj1nZW5vdHlwZSksZnVuLmRhdGE9bWVhbl9zZGwsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCAKICAgICAgICAgICAgICAgICBnZW9tPSJwb2ludHJhbmdlIixwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgwLjcpKSsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSxoanVzdD0xKSxzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDksIGNvbG91ciA9ICJibGFjayIsIGFuZ2xlID0gMCkpCmBgYAoKYGBge3IsIGZpZy5oZWlnaHQ9NSwgZmlnLndpZHRoPTEwfQoKZ2dwbG90KGRmX1A0X2VwaSxhZXMoZ2Vub3R5cGUsTXVjNCkpK2ZhY2V0X2dyaWQoLn5jZWxsX3R5cGUpK2dlb21fZG90cGxvdChiaW5heGlzPSJ5IixhZXMoZmlsbD1nZW5vdHlwZSksYmlud2lkdGg9MC4wNSxzdGFja2Rpcj0iY2VudGVyIixwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgwLjgpLCBkb3RzaXplPTAuMikrc3RhdF9jb21wYXJlX21lYW5zKGNvbXBhcmlzb25zID0gbGlzdChjKCJ3dCIsICJtdXQiKSksbWV0aG9kPSJ3aWxjb3gudGVzdCIsc2l6ZT00LGxhYmVsPSJwLmFkaiIpKyBzdGF0X3N1bW1hcnkoYWVzKGNvbG9yPWdlbm90eXBlKSxmdW4uZGF0YT1tZWFuX3NkbCwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIAogICAgICAgICAgICAgICAgIGdlb209InBvaW50cmFuZ2UiLHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKDAuNykpKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LGhqdXN0PTEpLHN0cmlwLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gOSwgY29sb3VyID0gImJsYWNrIiwgYW5nbGUgPSAwKSkKYGBgCmBgYHtyLCBmaWcuaGVpZ2h0PTUsIGZpZy53aWR0aD0xMH0KCmdncGxvdChkZl9QNF9lcGksYWVzKGdlbm90eXBlLE11YzIwKSkrZmFjZXRfZ3JpZCgufmNlbGxfdHlwZSkrZ2VvbV9kb3RwbG90KGJpbmF4aXM9InkiLGFlcyhmaWxsPWdlbm90eXBlKSxiaW53aWR0aD0wLjA1LHN0YWNrZGlyPSJjZW50ZXIiLHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKDAuOCksIGRvdHNpemU9MC4yKStzdGF0X2NvbXBhcmVfbWVhbnMoY29tcGFyaXNvbnMgPSBsaXN0KGMoInd0IiwgIm11dCIpKSxtZXRob2Q9IndpbGNveC50ZXN0IixzaXplPTQsbGFiZWw9InAuYWRqIikrIHN0YXRfc3VtbWFyeShhZXMoY29sb3I9Z2Vub3R5cGUpLGZ1bi5kYXRhPW1lYW5fc2RsLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgCiAgICAgICAgICAgICAgICAgZ2VvbT0icG9pbnRyYW5nZSIscG9zaXRpb249cG9zaXRpb25fZG9kZ2UoMC43KSkrIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsaGp1c3Q9MSksc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA5LCBjb2xvdXIgPSAiYmxhY2siLCBhbmdsZSA9IDApKQpgYGAKCgoKYGBge3IsIGZpZy5oZWlnaHQ9NSwgZmlnLndpZHRoPTEwfQoKZ2dwbG90KGRmX1A0X2VwaSxhZXMoZ2Vub3R5cGUsTGNuMikpK2ZhY2V0X2dyaWQoLn5jZWxsX3R5cGUpK2dlb21fZG90cGxvdChiaW5heGlzPSJ5IixhZXMoZmlsbD1nZW5vdHlwZSksYmlud2lkdGg9MC4wNSxzdGFja2Rpcj0iY2VudGVyIixwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgwLjgpLCBkb3RzaXplPTAuMikrc3RhdF9jb21wYXJlX21lYW5zKGNvbXBhcmlzb25zID0gbGlzdChjKCJ3dCIsICJtdXQiKSksbWV0aG9kPSJ3aWxjb3gudGVzdCIsc2l6ZT00LGxhYmVsPSJwLmFkaiIpKyBzdGF0X3N1bW1hcnkoYWVzKGNvbG9yPWdlbm90eXBlKSxmdW4uZGF0YT1tZWFuX3NkbCwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIAogICAgICAgICAgICAgICAgIGdlb209InBvaW50cmFuZ2UiLHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKDAuNykpKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LGhqdXN0PTEpLHN0cmlwLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gOSwgY29sb3VyID0gImJsYWNrIiwgYW5nbGUgPSAwKSkKYGBgCgpgYGB7ciwgZmlnLmhlaWdodD01LCBmaWcud2lkdGg9MTB9CgpnZ3Bsb3QoZGZfUDRfZXBpLGFlcyhnZW5vdHlwZSxDY2wyMCkpK2ZhY2V0X2dyaWQoLn5jZWxsX3R5cGUpK2dlb21fZG90cGxvdChiaW5heGlzPSJ5IixhZXMoZmlsbD1nZW5vdHlwZSksYmlud2lkdGg9MC4wNSxzdGFja2Rpcj0iY2VudGVyIixwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgwLjgpLCBkb3RzaXplPTAuMikrc3RhdF9jb21wYXJlX21lYW5zKGNvbXBhcmlzb25zID0gbGlzdChjKCJ3dCIsICJtdXQiKSksbWV0aG9kPSJ3aWxjb3gudGVzdCIsc2l6ZT00LGxhYmVsPSJwLmFkaiIpKyBzdGF0X3N1bW1hcnkoYWVzKGNvbG9yPWdlbm90eXBlKSxmdW4uZGF0YT1tZWFuX3NkbCwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIAogICAgICAgICAgICAgICAgIGdlb209InBvaW50cmFuZ2UiLHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKDAuNykpKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LGhqdXN0PTEpLHN0cmlwLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gOSwgY29sb3VyID0gImJsYWNrIiwgYW5nbGUgPSAwKSkKYGBgCmBgYHtyLCBmaWcuaGVpZ2h0PTUsIGZpZy53aWR0aD0xMH0KCmdncGxvdChkZl9QNF9lcGksYWVzKGdlbm90eXBlLEN4Y2wxNSkpK2ZhY2V0X2dyaWQoLn5jZWxsX3R5cGUpK2dlb21fZG90cGxvdChiaW5heGlzPSJ5IixhZXMoZmlsbD1nZW5vdHlwZSksYmlud2lkdGg9MC4wNSxzdGFja2Rpcj0iY2VudGVyIixwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgwLjgpLCBkb3RzaXplPTAuMikrc3RhdF9jb21wYXJlX21lYW5zKGNvbXBhcmlzb25zID0gbGlzdChjKCJ3dCIsICJtdXQiKSksbWV0aG9kPSJ3aWxjb3gudGVzdCIsc2l6ZT00LGxhYmVsPSJwLmFkaiIpKyBzdGF0X3N1bW1hcnkoYWVzKGNvbG9yPWdlbm90eXBlKSxmdW4uZGF0YT1tZWFuX3NkbCwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIAogICAgICAgICAgICAgICAgIGdlb209InBvaW50cmFuZ2UiLHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKDAuNykpKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LGhqdXN0PTEpLHN0cmlwLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gOSwgY29sb3VyID0gImJsYWNrIiwgYW5nbGUgPSAwKSkKYGBgCgpgYGB7ciwgZmlnLmhlaWdodD01LCBmaWcud2lkdGg9MTB9CgpnZ3Bsb3QoZGZfUDRfZXBpLGFlcyhnZW5vdHlwZSxDeGNsMTcpKStmYWNldF9ncmlkKC5+Y2VsbF90eXBlKStnZW9tX2RvdHBsb3QoYmluYXhpcz0ieSIsYWVzKGZpbGw9Z2Vub3R5cGUpLGJpbndpZHRoPTAuMDUsc3RhY2tkaXI9ImNlbnRlciIscG9zaXRpb249cG9zaXRpb25fZG9kZ2UoMC44KSwgZG90c2l6ZT0wLjIpK3N0YXRfY29tcGFyZV9tZWFucyhjb21wYXJpc29ucyA9IGxpc3QoYygid3QiLCAibXV0IikpLG1ldGhvZD0id2lsY294LnRlc3QiLHNpemU9NCxsYWJlbD0icC5hZGoiKSsgc3RhdF9zdW1tYXJ5KGFlcyhjb2xvcj1nZW5vdHlwZSksZnVuLmRhdGE9bWVhbl9zZGwsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCAKICAgICAgICAgICAgICAgICBnZW9tPSJwb2ludHJhbmdlIixwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgwLjcpKSsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSxoanVzdD0xKSxzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDksIGNvbG91ciA9ICJibGFjayIsIGFuZ2xlID0gMCkpCmBgYApgYGB7ciwgZmlnLmhlaWdodD01LCBmaWcud2lkdGg9Nn0KCmdncGxvdChkZl9QNF9lcGksYWVzKGdlbm90eXBlLENoaWw0KSkrZmFjZXRfZ3JpZCgufmNlbGxfdHlwZSkrZ2VvbV9kb3RwbG90KGJpbmF4aXM9InkiLGFlcyhmaWxsPWdlbm90eXBlKSxiaW53aWR0aD0wLjA1LHN0YWNrZGlyPSJjZW50ZXIiLHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKDAuOCksIGRvdHNpemU9MC4yKStzdGF0X2NvbXBhcmVfbWVhbnMoY29tcGFyaXNvbnMgPSBsaXN0KGMoInd0IiwgIm11dCIpKSxtZXRob2Q9IndpbGNveC50ZXN0IixzaXplPTQsbGFiZWw9InAuYWRqIikrIHN0YXRfc3VtbWFyeShhZXMoY29sb3I9Z2Vub3R5cGUpLGZ1bi5kYXRhPW1lYW5fc2RsLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgCiAgICAgICAgICAgICAgICAgZ2VvbT0icG9pbnRyYW5nZSIscG9zaXRpb249cG9zaXRpb25fZG9kZ2UoMC43KSkrIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsaGp1c3Q9MSksc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA5LCBjb2xvdXIgPSAiYmxhY2siLCBhbmdsZSA9IDApKQpgYGAKYGBge3IsIGZpZy5oZWlnaHQ9NSwgZmlnLndpZHRoPTZ9CgpnZ3Bsb3QoZGZfUDRfZXBpLGFlcyhnZW5vdHlwZSxQaWdyKSkrZmFjZXRfZ3JpZCgufmNlbGxfdHlwZSkrZ2VvbV9kb3RwbG90KGJpbmF4aXM9InkiLGFlcyhmaWxsPWdlbm90eXBlKSxiaW53aWR0aD0wLjA1LHN0YWNrZGlyPSJjZW50ZXIiLHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKDAuOCksIGRvdHNpemU9MC4yKStzdGF0X2NvbXBhcmVfbWVhbnMoY29tcGFyaXNvbnMgPSBsaXN0KGMoInd0IiwgIm11dCIpKSxtZXRob2Q9IndpbGNveC50ZXN0IixzaXplPTQsbGFiZWw9InAuYWRqIikrIHN0YXRfc3VtbWFyeShhZXMoY29sb3I9Z2Vub3R5cGUpLGZ1bi5kYXRhPW1lYW5fc2RsLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgCiAgICAgICAgICAgICAgICAgZ2VvbT0icG9pbnRyYW5nZSIscG9zaXRpb249cG9zaXRpb25fZG9kZ2UoMC43KSkrIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsaGp1c3Q9MSksc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA5LCBjb2xvdXIgPSAiYmxhY2siLCBhbmdsZSA9IDApKQpgYGAKCmBgYHtyLCBmaWcuaGVpZ2h0PTUsIGZpZy53aWR0aD02fQoKZ2dwbG90KGRmX1A0X2VwaSxhZXMoZ2Vub3R5cGUsS3J0NCkpK2ZhY2V0X2dyaWQoLn5jZWxsX3R5cGUpK2dlb21fZG90cGxvdChiaW5heGlzPSJ5IixhZXMoZmlsbD1nZW5vdHlwZSksYmlud2lkdGg9MC4wNSxzdGFja2Rpcj0iY2VudGVyIixwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgwLjgpLCBkb3RzaXplPTAuMikrc3RhdF9jb21wYXJlX21lYW5zKGNvbXBhcmlzb25zID0gbGlzdChjKCJ3dCIsICJtdXQiKSksbWV0aG9kPSJ3aWxjb3gudGVzdCIsc2l6ZT00LGxhYmVsPSJwLmFkaiIpKyBzdGF0X3N1bW1hcnkoYWVzKGNvbG9yPWdlbm90eXBlKSxmdW4uZGF0YT1tZWFuX3NkbCwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIAogICAgICAgICAgICAgICAgIGdlb209InBvaW50cmFuZ2UiLHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKDAuNykpKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LGhqdXN0PTEpLHN0cmlwLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gOSwgY29sb3VyID0gImJsYWNrIiwgYW5nbGUgPSAwKSkKYGBgCgoKYGBge3IsIGZpZy5oZWlnaHQ9NSwgZmlnLndpZHRoPTZ9CgpnZ3Bsb3QoZGZfUDRfZXBpLGFlcyhnZW5vdHlwZSxTb3N0ZGMxKSkrZmFjZXRfZ3JpZCgufmNlbGxfdHlwZSkrZ2VvbV9kb3RwbG90KGJpbmF4aXM9InkiLGFlcyhmaWxsPWdlbm90eXBlKSxiaW53aWR0aD0wLjAxLHN0YWNrZGlyPSJjZW50ZXIiLHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKDAuOCksIGRvdHNpemU9MC4yKStzdGF0X2NvbXBhcmVfbWVhbnMoY29tcGFyaXNvbnMgPSBsaXN0KGMoInd0IiwgIm11dCIpKSxtZXRob2Q9IndpbGNveC50ZXN0IixzaXplPTQsbGFiZWw9InAuYWRqIikrIHN0YXRfc3VtbWFyeShhZXMoY29sb3I9Z2Vub3R5cGUpLGZ1bi5kYXRhPW1lYW5fc2RsLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgCiAgICAgICAgICAgICAgICAgZ2VvbT0icG9pbnRyYW5nZSIscG9zaXRpb249cG9zaXRpb25fZG9kZ2UoMC43KSkrIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsaGp1c3Q9MSksc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA5LCBjb2xvdXIgPSAiYmxhY2siLCBhbmdsZSA9IDApKQpgYGAKCmBgYHtyLCBmaWcuaGVpZ2h0PTUsIGZpZy53aWR0aD02fQoKZ2dwbG90KGRmX1A0X2VwaSxhZXMoZ2Vub3R5cGUsS3J0MTMpKStmYWNldF9ncmlkKC5+Y2VsbF90eXBlKStnZW9tX2RvdHBsb3QoYmluYXhpcz0ieSIsYWVzKGZpbGw9Z2Vub3R5cGUpLGJpbndpZHRoPTAuMDUsc3RhY2tkaXI9ImNlbnRlciIscG9zaXRpb249cG9zaXRpb25fZG9kZ2UoMC44KSwgZG90c2l6ZT0wLjIpK3N0YXRfY29tcGFyZV9tZWFucyhjb21wYXJpc29ucyA9IGxpc3QoYygid3QiLCAibXV0IikpLG1ldGhvZD0id2lsY294LnRlc3QiLHNpemU9NCxsYWJlbD0icC5hZGoiKSsgc3RhdF9zdW1tYXJ5KGFlcyhjb2xvcj1nZW5vdHlwZSksZnVuLmRhdGE9bWVhbl9zZGwsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCAKICAgICAgICAgICAgICAgICBnZW9tPSJwb2ludHJhbmdlIixwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgwLjcpKSsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSxoanVzdD0xKSxzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDksIGNvbG91ciA9ICJibGFjayIsIGFuZ2xlID0gMCkpCmBgYAoKCgpgYGB7cn0KcmVzLnVzZWQgPC0gMS4yCmBgYAoKYGBge3J9ClA0X09jdDE4X2VwaSA8LSBGaW5kQ2x1c3RlcnMob2JqZWN0ID0gUDRfT2N0MThfZXBpLCByZWR1Y3Rpb24udHlwZSA9ICJwY2EiLCBkaW1zLnVzZSA9IDE6bi5wY3Muc3ViLCAKICAgICAgICAgICAgICAgICAgICAgcmVzb2x1dGlvbiA9IHJlcy51c2VkLCBwcmludC5vdXRwdXQgPSAwLCBmb3JjZS5yZWNhbGMgPSBUKQpgYGAKYGBge3J9ClA0X09jdDE4X2VwaSA8LSBSdW5UU05FKG9iamVjdCA9IFA0X09jdDE4X2VwaSwgZGltcy51c2UgPSAxOm4ucGNzLnN1YiwgcGVycGxleGl0eT0zMCkKYGBgCmBgYHtyLCBmaWcud2lkdGg9MTAsZmlnLmhlaWdodD02fQpUU05FUGxvdChvYmplY3QgPSBQNF9PY3QxOF9lcGksIGRvLmxhYmVsID0gVCxwdC5zaXplID0gMC40LGdyb3VwLmJ5PSJyZXMuMS4yIikKYGBgCmBgYHtyLGZpZy5oZWlnaHQ9MTIsZmlnLndpZHRoPTM1fQoKRG9IZWF0bWFwKG9iamVjdCA9IFA0X09jdDE4X2VwaSwgZ2VuZXMudXNlID0gYygiRXBjYW0iLCJUcnA2MyIsIktydDUiLCJLcnQxNCIsIlNvc3RkYzEiLCJNa2k2NyIsIlRvcDJhIiwiS3J0NCIsIktydDEzIiwiU3BkZWYiLCJDcmViM2wxIiwiTXVjNWFjIiwiR3AyIiwiR2FsbnQ2IiwiUHRnZHIiLCJDZDE3NyIsIkZveGoxIiwiRm94bjQiLCJTaGlzYTgiKSwgCiAgICBzbGltLmNvbC5sYWJlbCA9IFRSVUUsIGdyb3VwLmxhYmVsLnJvdCA9IFRSVUUsdXNlLnNjYWxlZCA9IFQsZ3JvdXAuYnkgPSAicmVzLjEuMiIsY2V4LnJvdyA9IDMwLGdyb3VwLmNleCA9IDMwCiAgKQpgYGAKCmBgYHtyfQp0YWJsZShQNF9PY3QxOF9lcGlAbWV0YS5kYXRhJHJlcy4wLjgsUDRfT2N0MThfZXBpQG1ldGEuZGF0YSRyZXMuMS4yKQpgYGAKCmBgYHtyfQpyZXMudXNlZCA8LSAxLjQKYGBgCgpgYGB7cn0KUDRfT2N0MThfZXBpIDwtIEZpbmRDbHVzdGVycyhvYmplY3QgPSBQNF9PY3QxOF9lcGksIHJlZHVjdGlvbi50eXBlID0gInBjYSIsIGRpbXMudXNlID0gMTpuLnBjcy5zdWIsIAogICAgICAgICAgICAgICAgICAgICByZXNvbHV0aW9uID0gcmVzLnVzZWQsIHByaW50Lm91dHB1dCA9IDAsIGZvcmNlLnJlY2FsYyA9IFQpCmBgYApgYGB7cn0KUDRfT2N0MThfZXBpIDwtIFJ1blRTTkUob2JqZWN0ID0gUDRfT2N0MThfZXBpLCBkaW1zLnVzZSA9IDE6bi5wY3Muc3ViLCBwZXJwbGV4aXR5PTMwKQpgYGAKYGBge3IsIGZpZy53aWR0aD0xMCxmaWcuaGVpZ2h0PTZ9ClRTTkVQbG90KG9iamVjdCA9IFA0X09jdDE4X2VwaSwgZG8ubGFiZWwgPSBULHB0LnNpemUgPSAwLjQsZ3JvdXAuYnk9InJlcy4xLjQiKQpgYGAKYGBge3IsZmlnLmhlaWdodD0xNSxmaWcud2lkdGg9NDB9CkRvSGVhdG1hcChvYmplY3QgPSBQNF9PY3QxOF9lcGksIGdlbmVzLnVzZSA9IGMoIkVwY2FtIiwiVHJwNjMiLCJLcnQ1IiwiS3J0MTQiLCJCbXA3IiwiU21vYzIiLCJTb3N0ZGMxIiwiQ2xpYzMiLCJNa2k2NyIsIlRvcDJhIiwiU3BkZWYiLCJDcmViM2wxIiwiS3J0NCIsIktydDEzIiwiQ2l0ZWQxIiwiS2xrMTAiLCJLbGsxMyIsIktsazExIiwiRG5hamI5IiwiTXVjMTYiLCJNdWM1YiIsIkdwMiIsIlRmZjIiLCJDZ3JlZjEiLCJHYWxudDYiLCJCM2dudDYiLCJQdGdkciIsIkNkMTc3IiwiRm94ajEiLCJGb3huNCIpLCAKICAgIHNsaW0uY29sLmxhYmVsID0gVFJVRSwgZ3JvdXAubGFiZWwucm90ID0gVFJVRSx1c2Uuc2NhbGVkID0gVCxncm91cC5ieSA9ICJyZXMuMS40IixjZXgucm93ID0gMzAsZ3JvdXAub3JkZXIgPSBjKDExLDUsNywxMiwwLDYsNCwyLDksMTAsOCwxLDEzLDMpLGdyb3VwLmNleCA9IDMwCiAgKQpgYGAKCmBgYHtyfQp0YWJsZShQNF9PY3QxOF9lcGlAbWV0YS5kYXRhJHJlcy4wLjgsUDRfT2N0MThfZXBpQG1ldGEuZGF0YSRyZXMuMS40KQpgYGAKCmBgYHtyfQp0YWJsZShQNF9PY3QxOF9lcGlAbWV0YS5kYXRhJGdlbm90eXBlLFA0X09jdDE4X2VwaUBtZXRhLmRhdGEkcmVzLjEuNCkKYGBgCmBgYHtyfQpQNF9PY3QxOF9lcGlAbWV0YS5kYXRhJHNwZWNpZmljX3R5cGU8LW1hcHZhbHVlcyhQNF9PY3QxOF9lcGlAbWV0YS5kYXRhJHJlcy4wLjgsZnJvbT1jKCIwIiwiMSIsIjIiLCIzIiwiNCIsIjUiLCI2IiwiNyIsIjgiLCI5IiksdG89YygiU2VjcmV0b3J5IiwiU2VjcmV0b3J5LUtydDQiLCJDaWxpYXRlZCIsIlNlY3JldG9yeS1LcnQ0IiwiQ2lsaWFTZWNyZXRvcnkiLCJTZWNyZXRvcnktS3J0NCIsIkJhc2FsIiwiQmFzYWwiLCJDaWxpYXRlZCIsIkNpbGlhdGVkLUZveG40IikpCmBgYAoKYGBge3IsZmlnLndpZHRoPTUsZmlnLmhlaWdodD01fQpnZ3Bsb3QoZGF0YT1QNF9PY3QxOF9lcGlAbWV0YS5kYXRhLGFlcyhnZW5vdHlwZSxmaWxsPXNwZWNpZmljX3R5cGUpKSsgCiAgICBnZW9tX2Jhcihwb3NpdGlvbj0iZmlsbCIpKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKQpgYGAKCmBgYHtyfQpQNF9PY3QxOF9lcGlAbWV0YS5kYXRhJHNwZWNpZmljX3R5cGVfMS40PC1tYXB2YWx1ZXMoUDRfT2N0MThfZXBpQG1ldGEuZGF0YSRyZXMuMS40LGZyb209YygiMCIsIjEiLCIyIiwiMyIsIjQiLCI1IiwiNiIsIjciLCI4IiwiOSIsIjEwIiwiMTEiLCIxMiIsIjEzIiksdG89YygiU2VjcmV0b3J5IiwiQ2lsaWF0ZWQiLCJTZWNyZXRvcnkiLCJDaWxpYVNlY3JldG9yeSIsIlNlY3JldG9yeSIsIkN5Y2xpbmdTZWNyZXRvcnkiLCJTZWNyZXRvcnkiLCJCYXNhbC1Tb3N0ZGMxIiwiQ2lsaWF0ZWQiLCJTZWNyZXRvcnktS3J0NCIsIkNpbGlhdGVkIiwiQ3ljbGluZ0Jhc2FsIiwiQmFzYWwiLCJDaWxpYXRlZCIpKQpgYGAKIyMjIyMgdG8gc3VwcG9ydCB0aGlzIGlkZW50aWZpY2F0aW9uOgpgYGB7cixmaWcuaGVpZ2h0PTMsZmlnLndpZHRoPTh9ClA0X09jdDE4X2VwaTwtU2V0QWxsSWRlbnQob2JqZWN0ID0gUDRfT2N0MThfZXBpLCBpZCA9ICJzcGVjaWZpY190eXBlXzEuNCIpCgpQNF9PY3QxOF9lcGlAaWRlbnQ9ZmFjdG9yKFA0X09jdDE4X2VwaUBpZGVudCxsZXZlbHMoUDRfT2N0MThfZXBpQGlkZW50KVtjKDMsNCw3LDgsMSwyLDYsNSldKQpEb3RQbG90KG9iamVjdCA9IFA0X09jdDE4X2VwaSwgY29scy51c2UgPSBjKCJsaWdodGdyZXkiLCJyZWQiKSxnZW5lcy5wbG90ID0gYygiRm94ajEiLCJQdGdkciIsIkIzZ250NiIsIkdhbG50NiIsIkNncmVmMSIsIkdwMiIsIlRmZjIiLCJNdWM1YiIsIk11YzE2IiwiQ2l0ZWQxIiwiS3J0NCIsIkNyZWIzbDEiLCJTcGRlZiIsIkNsaWMzIiwiQ2NsMjAiLCJTb3N0ZGMxIiwiU21vYzIiLCJLcnQxNCIsIkJtcDciLCJUcnA2MyIsIktydDUiLCJNa2k2NyIsIlRvcDJhIiksZ3JvdXAuYnkgPSAiaWRlbnQiLCB4LmxhYi5yb3QgPSBULHBsb3QubGVnZW5kID0gVCkKYGBgCmBgYHtyLGZpZy5oZWlnaHQ9MyxmaWcud2lkdGg9Ni41fQpQNF9PY3QxOF9lcGk8LVNldEFsbElkZW50KG9iamVjdCA9IFA0X09jdDE4X2VwaSwgaWQgPSAic3BlY2lmaWNfdHlwZV8xLjQiKQoKUDRfT2N0MThfZXBpQGlkZW50PWZhY3RvcihQNF9PY3QxOF9lcGlAaWRlbnQsbGV2ZWxzKFA0X09jdDE4X2VwaUBpZGVudClbYygzLDQsNyw4LDEsMiw2LDUpXSkKRG90UGxvdChvYmplY3QgPSBQNF9PY3QxOF9lcGksIGNvbHMudXNlID0gYygibGlnaHRncmV5IiwicmVkIiksZ2VuZXMucGxvdCA9IGMoIkZveGoxIiwiQjNnbnQ2IiwiQ2dyZWYxIiwiR3AyIiwiVGZmMiIsIk11YzViIiwiS3J0NCIsIkNyZWIzbDEiLCJTcGRlZiIsIkNsaWMzIiwiU29zdGRjMSIsIlNtb2MyIiwiVHJwNjMiLCJLcnQ1IiwiTWtpNjciLCJUb3AyYSIpLGdyb3VwLmJ5ID0gImlkZW50IiwgeC5sYWIucm90ID0gVCxwbG90LmxlZ2VuZCA9IFQpCmBgYAoKYGBge3J9CnRhYmxlKFA0X09jdDE4X2VwaUBtZXRhLmRhdGEkc3BlY2lmaWNfdHlwZV8xLjQsUDRfT2N0MThfZXBpQG1ldGEuZGF0YSRnZW5vdHlwZSkKYGBgCmBgYHtyLGZpZy53aWR0aD01LGZpZy5oZWlnaHQ9NX0KZ2dwbG90KGRhdGE9UDRfT2N0MThfZXBpQG1ldGEuZGF0YSxhZXMoZ2Vub3R5cGUsZmlsbD1zcGVjaWZpY190eXBlXzEuNCkpKyAKICAgIGdlb21fYmFyKHBvc2l0aW9uPSJmaWxsIikrIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkpCmBgYAoKYGBge3IsZmlnLndpZHRoPTUsZmlnLmhlaWdodD01fQpzYXZlKFA0X09jdDE4X2VwaSxmaWxlPSJQNF9lcGlfbW0xMC4xLjIuMC5SRGF0YSIpCmBgYAoKCgoKCgoK